使用 hbm2ddl 创建 ID 和 DB 方案的共享序列生成器
Posted
技术标签:
【中文标题】使用 hbm2ddl 创建 ID 和 DB 方案的共享序列生成器【英文标题】:Shared sequence generator for IDs and DB scheme creation using hbm2ddl 【发布时间】:2011-12-03 02:02:52 【问题描述】:全部。我在通过 hbm2ddl 生成数据库方案时遇到问题。 我想对所有私钥使用共享序列生成器。所以我在某个实体中定义了一次。
@Entity
@SequenceGenerator(name = "MY_SEQUENCE_GENERATOR", sequenceName = "MY_SEQ")
public class MyEntity implements Serializable
....
然后我想对所有 id 使用这个序列生成器。
public class SomeEntity1 implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE_GENERATOR")
Long id;
....
public class SomeEntity2 implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE_GENERATOR")
Long id;
....
当我运行 hbm2ddl ant 任务时出现异常:
[hibernatetool] javax.persistence.PersistenceException: org.hibernate.AnnotationException: Unknown Id.generator: MY_SEQUENCE_GENERATOR
[hibernatetool] org.hibernate.AnnotationException: Unknown Id.generator: MY_SEQUENCE_GENERATOR
这是一个问题还是我做错了什么?
【问题讨论】:
您要在哪个数据库上执行此操作? 我正在尝试为 Oracle 11g 生成方案创建脚本。 【参考方案1】:序列导入,即@SequenceGenerator
注解应该出现在所有类中。因此,使用此注释创建一个抽象类并从中扩展所有实体:
@SequenceGenerator(name = "MY_SEQUENCE_GENERATOR", sequenceName = "MY_SEQ")
public abstract class BaseEntity implements Serializable
....
public class SomeEntity1 extends BaseEntity
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE_GENERATOR")
Long id;
....
public class SomeEntity2 extends BaseEntity
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE_GENERATOR")
Long id;
....
【讨论】:
感谢@forker 的回复。但是@SequenceGenerator 的javadoc 告诉我们"A sequence generator may be specified on the entity class or on the primary key field or property. The scope of the generator name is global to the persistence unit (across all generator types)"
。【参考方案2】:
这个问题的解决方案是在 package-ingo.java 文件中定义共享的@SequenceGenerator,以便我放置我的实体。
【讨论】:
以上是关于使用 hbm2ddl 创建 ID 和 DB 方案的共享序列生成器的主要内容,如果未能解决你的问题,请参考以下文章
如何让hibernate hbm2ddl生成带分号的SQL?
告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列
hibernate.hbm2ddl.auto Hibernate 如何决定何时创建或更新 ddl?
hibernate.hbm2ddl.auto =创建(不创建表)