如何结合 TABLE_PER_CLASS 和 GenerationType.IDENTITY

Ang*_*chs 5 java mysql spring persistence hibernate

亲爱的未来读者:在完成Sannes 的回答和他提供的链接之后,我决定改用 Sequence。较新的 Hibernates 注意它也适用于 MySQL。


我有一个abstract类,其中包含我希望在所有实体中拥有的一些基本值(例如 ID、创建日期、创建用户等)。目前,我在为每个具体类拥有一张表并使其 id 工作的组合而苦苦挣扎。

似乎我可以为每个班级设置一个表,也可以在一个地方设置 ID,但不能同时设置两者。这对我来说似乎很奇怪而且不太可能,所以我想确保情况确实如此。

可能相关的版本:hibernate 5、mysql 5.5、java 1.8、spring 4.3。

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@MappedSuperclass
public abstract class GeneralData implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    protected int id;
    protected String name;

    // getters, setters, constructors, etc.
}
Run Code Online (Sandbox Code Playgroud)

示例子类:

@Entity
public class ExampleClass extends GeneralData {
    // own values, constructors, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Cannot use identity column key generation with <union-subclass> mapping for: org.example.ExampleClass
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情:

  • 我试图制作GeneralData一个@Entity,但这没有帮助。
  • 我尝试使用 aGenerationType.TABLE但失败了,因为密钥太大。(另外,我宁愿没有这个,IDENTITY 是我想要的)错误:Specified key was too long; max key length is 1000 bytes

我宁愿不将 id 列移动到每个具体类。如果 ID 仅对于单个表而不是通过整个依赖树是唯一的,我完全没问题。

如果我应该升级我的库、数据库等,请记住,这只能通过大量额外工作来完成(出于内部原因)。这将是最后的手段,我希望首先看到一些证据表明它有帮助。

San*_*nne 5

对同一父实体的所有子对象的要求是它们之间具有唯一的 ID。

例如,假设您有一个父实体GeneralData,然后存储Aid=1 的子类型。这将是完全合法的:

GeneralData loaded = entitymanager.find( GeneralData.class, 1 );
Run Code Online (Sandbox Code Playgroud)

当然,类型loaded将是A:子类。映射必须确保没有歧义:不允许其他子类也使用“1”作为 ID,即使它被映射到不同的表中

在您的情况下,您要求 Hibernate 将每个不同的子类型存储GeneralData到自己单独的表中。

您还要求 MySQL - 它不知道这些表以任何方式相关 - 自动分配唯一标识符。

不可能指示 MySQL 每个表都需要使用相同的Identity“序列”,因为它们不是真正的序列:所以这种映射是非法的!这会给您带来麻烦,因为它会将重叠的 ID 分配给您的父实体的不同子类型,从而违反上述语义。

这是使用 IDENTITY 的局限性的一个很好的例子;此外,IDENTITY 的效率不是很高,因为它意味着 Hibernate 需要在实体持久化后立即写入,而不是能够更有效地将刷新操作推迟到更合适的时间,因此可能会批量写入或完全跳过它们(特别是如果事务被中止,而且如果你在持久化之后更新实体但仍然在同一个事务中)。

我建议查看此类层次结构的不同标识符生成器策略,特别是优化器可能会极大地提高应用程序的性能。