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,但这没有帮助。GenerationType.TABLE但失败了,因为密钥太大。(另外,我宁愿没有这个,IDENTITY 是我想要的)错误:Specified key was too long; max key length is 1000 bytes我宁愿不将 id 列移动到每个具体类。如果 ID 仅对于单个表而不是通过整个依赖树是唯一的,我完全没问题。
如果我应该升级我的库、数据库等,请记住,这只能通过大量额外工作来完成(出于内部原因)。这将是最后的手段,我希望首先看到一些证据表明它有帮助。
对同一父实体的所有子对象的要求是它们之间具有唯一的 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 需要在实体持久化后立即写入,而不是能够更有效地将刷新操作推迟到更合适的时间,因此可能会批量写入或完全跳过它们(特别是如果事务被中止,而且如果你在持久化之后更新实体但仍然在同一个事务中)。
我建议查看此类层次结构的不同标识符生成器策略,特别是优化器可能会极大地提高应用程序的性能。
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |