不能使用<union-subclass>(TABLE_PER_CLASS)标识列密钥生成

com.something.SuperClass:

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class SuperClass implements Serializable { private static final long serialVersionUID = -695503064509648117L; long confirmationCode; @Id @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!! public long getConfirmationCode() { return confirmationCode; } public void setConfirmationCode(long confirmationCode) { this.confirmationCode = confirmationCode; } } 

com.something.SubClass:

 @Entity public abstract class Subclass extends SuperClass { private static final long serialVersionUID = 8623159397061057722L; String name; @Column(nullable = false) public String getName() { return name; } public void setName(String name) { this.name = name; } } 

给我这个例外:

 Caused by: org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: com.something.SuperClass 

什么是最好和最方便的方式来生成ID的? 我不想改变我的inheritance策略。

这里的问题是你混合了“每classinheritance”和GenerationType.Auto 。 考虑一下MsSQL中的标识列。 它是基于列的。 在“每class级表”策略中,每个class级使用一个表格,每个表格都有一个ID。

尝试:

@GeneratedValue(strategy = GenerationType.TABLE)

我不知道这是否是一个数据库方言的具体问题,因为看了一个YouTube的教程,使用PostgreSQL作为底层数据库,我看到video的创build者成功地运行了默认的@GeneratedValue的应用程序。 在我的情况下(底层数据库是MySQL),我必须修改@GeneratedValue策略为GenerationType.TABLE完全按照zoidbeckbuild议。

以下是video: https : //www.youtube.com/watch?v = qIdM4KQOtH8

在我们的例子中,我们使用PostreSQL数据库进行开发和生产,并使用内存中的hsqldb数据库进行testing。 我们在这两种情况下都使用一个序列来生成一个id。 显然GenerationType.AUTO默认为SEQUENCE for postgres,但在我们的本地testing中失败(必须默认为其他的hsqldb)。

所以为我们工作的解决scheme明确使用了GenerationType.SEQUENCE

同意zoidbeck的回答。 您需要将策略更改为:

 @GeneratedValue(strategy = GenerationType.TABLE) 

但是,这还不是全部,你需要创build一个新的表,什么将保存你的抽象表的主键序列。 修改你的映射

 @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator") @TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator") public long getConfirmationCode() { return confirmationCode; } 

数据库中的新表应该如下所示: 在这里输入图像说明

当你运行你的应用程序时,Hibernate会插入一行,其中sequence_name将是实体名称(本例中是SuperClass ), sequence_next_hi_value值将被自动递增并用于所有实现子类表的新logging。

MySQL和PostgreSQL之间有一个SQL标准合规性。 PostgreSQL Postgres了解SQL92 / 99的一个很好的子集以及这些子集的一些面向对象的特性。 Postgres能够处理复杂的例程和规则,如声明式SQL查询,子查询,视图,多用户支持,事务,查询优化,inheritance和数组。 不支持在不同数据库中select数据。

MySQL MySQL使用SQL92作为其基础。 运行在无数的平台上。 Mysql可以构build可以连接来自不同数据库的表的查询。 使用ANSI和ODBC语法支持左外连接和右外连接。 从该版本开始,MySQL将处理子查询。 视图支持截至版本5。

有关详细说明,请访问。 http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html

你可以使用@MappedSuperclassinheritance

Interesting Posts