不能使用<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