java - 我如何结合 TABLE_PER_CLASS 和 GenerationType.IDENTITY

标签 java mysql spring hibernate persistence

亲爱的 future 读者:在完成 Sannes answer 之后和他提供的链接,我决定改用序列。较新的 Hibernates 会注意它也适用于 MySQL。


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

看来我可以为每个类(class)配置一张表,也可以在一个地方配置 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.
}

示例子类:

@Entity
public class ExampleClass extends GeneralData {
    // own values, constructors, getters, setters, etc.
}

我得到的错误:

Cannot use identity column key generation with <union-subclass> mapping for: org.example.ExampleClass

我尝试过的事情:

  • 我曾尝试将 GeneralData 设为 @Entity,但这没有帮助。
  • I tried to使用 GenerationType.TABLE 但由于 key 太大而失败。 (另外,我宁愿没有这个,IDENTITY 是我想要的)错误:指定的 key 太长;最大 key 长度为 1000 字节

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

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

最佳答案

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

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

GeneralData loaded = entitymanager.find( GeneralData.class, 1 );

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

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

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

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

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

我建议看看不同的 Identifier generator strategies对于这样的层次结构,特别是 Optimizers可能会大大提高您的应用程序的性能。

关于java - 我如何结合 TABLE_PER_CLASS 和 GenerationType.IDENTITY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47455957/

相关文章:

php - 使用 and 过滤 mysql 内连接一对多结果

PHP INSERT INTO 不起作用,没有错误

java - 有一种干净的方法可以在 Spring Web API 中将字符串作为 json 返回吗?

java - 设计数据库自动完成功能的最佳方法

java - 使用数组创建具有给定值的直方图帮助请:(

java - 在 JVM 之上运行/解释 C?

java - 集中式 API 提供者 - oAuth 与否?

java - 褪色的回文,我想从字符串中删除 '.'(点)字符

spring - java.lang.IllegalArgumentException : 'sessionFactory' or 'hibernateTemplate' is required in spring+hibernate

PHP - 数组的 else 参数不起作用