Java 继承:将超类的@Id注释为具有不同序列的子类
我正在将旧项目(核心Java+EJB+hibernate)从Hibernate3迁移到Hibernate5.2.12。虽然hibernate 5.2.12支持.hbm.xml文件,但作为从.hbm文件升级到带注释文件的一部分 下面是我的场景,数据模型是紧密耦合的类Java 继承:将超类的@Id注释为具有不同序列的子类,java,hibernate,migration,hibernate-mapping,Java,Hibernate,Migration,Hibernate Mapping,我正在将旧项目(核心Java+EJB+hibernate)从Hibernate3迁移到Hibernate5.2.12。虽然hibernate 5.2.12支持.hbm.xml文件,但作为从.hbm文件升级到带注释文件的一部分 下面是我的场景,数据模型是紧密耦合的类 public interface BaseEntity extends Serializable, Cloneable, Observable { public void setId(long id); public
public interface BaseEntity extends Serializable, Cloneable, Observable
{
public void setId(long id);
public long getId();
... few other generic attributes
}
public class BaseClass implements BaseEntity {
protected long id;
public void setId(long id)
{
this.id = id;
}
public long getId()
{
return objectId;
}
.. few other attributes
}
public class AuditableBaseClass extends BaseClass implements BaseEntity, Audit
{
... few other attributes
}
public class Car extends AuditableBaseClass {
.... some attributes
}
public class Bike extends AuditableBaseClass {
...some attributes
}
public class Truck extends AuditableBaseClass {
... some attributes
}
如果我们看一下下面现有的.hbm.xml文件,就会发现不同的类使用了不同的序列
<class name="Car" table="Car">
<id name="id" type="long" column="id">
<generator class="sequence">
<param name="sequence">SEQ_CAR</param>
</generator>
</id>
<
// some other properties
</class>
<class name="Bike" table="Bike">
<id name="id" type="long" column="id">
<generator class="sequence">
<param name="sequence">SEQ_BIKE</param>
</generator>
</id>
// some other properties
</class>
<class name="Truck" table="Truck">
<id name="objectId" type="long" column="id">
<generator class="sequence">
<param name="sequence">SEQ_TRUCK</param>
</generator>
</id>
</class>
事实上,我知道我们需要使用@MappedSuperclass
来表示超类。如何表示@Id列的序列属性,该列对不同的子类使用不同的序列,尽管所有类都继承属性Id,但对每个子类使用不同的序列。
有什么帮助吗?Hibernate 5.2不允许我们有两个同名的标识符生成器,即使它们有不同的配置,因为范围是全局的,如JPA规范所述。因此,您需要在实体类中定义标识符和生成器 序列生成器可以在实体类或主键字段或属性上指定。生成器名称的作用域对于持久性单元是全局的(跨所有生成器类型)
参考:by@Vlad MihalceaHibernate 5.2不允许我们有两个同名的标识符生成器,即使它们有不同的配置,因为范围是全局的,如JPA规范所述。因此,您需要在实体类中定义标识符和生成器 序列生成器可以在实体类或主键字段或属性上指定。生成器名称的作用域对于持久性单元是全局的(跨所有生成器类型)
参考:通过@Vlad Mihalcea首先,您必须为基类设置@MappedSuperclass,并使用@GeneratedValue作为属性id和修复生成器。 然后在子类中使用@SequenceGenerator,并在基类中使用generator设置name属性
@MappedSuperclass
public class BaseClass implements BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq_gen")
@Column(name = "ID")
protected long id;
public void setId(long id)
{
this.id = id;
}
public long getId()
{
return objectId;
}
.. few other attributes
}
public class AuditableBaseClass extends BaseClass implements BaseEntity, Audit
{
... few other attributes
}
@Entity
@Table(name="car")
@SequenceGenerator(sequenceName = "car_id_seq", allocationSize = 1, name = "my_seq_gen")
public class Car extends AuditableBaseClass {
.... some attributes
}
@Entity
@Table(name="bike")
@SequenceGenerator(sequenceName = "bike_id_seq", allocationSize = 1, name = "my_seq_gen")
public class Bike extends AuditableBaseClass {
.... some attributes
}
@Entity
@Table(name="truck")
@SequenceGenerator(sequenceName = "truck_id_seq", allocationSize = 1, name = "my_seq_gen")
public class Truck extends AuditableBaseClass {
... some attributes
}
首先,您必须为基类设置@MappedSuperclass,并将@GeneratedValue用于具有修复生成器的属性id。 然后在子类中使用@SequenceGenerator,并在基类中使用generator设置name属性
@MappedSuperclass
public class BaseClass implements BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq_gen")
@Column(name = "ID")
protected long id;
public void setId(long id)
{
this.id = id;
}
public long getId()
{
return objectId;
}
.. few other attributes
}
public class AuditableBaseClass extends BaseClass implements BaseEntity, Audit
{
... few other attributes
}
@Entity
@Table(name="car")
@SequenceGenerator(sequenceName = "car_id_seq", allocationSize = 1, name = "my_seq_gen")
public class Car extends AuditableBaseClass {
.... some attributes
}
@Entity
@Table(name="bike")
@SequenceGenerator(sequenceName = "bike_id_seq", allocationSize = 1, name = "my_seq_gen")
public class Bike extends AuditableBaseClass {
.... some attributes
}
@Entity
@Table(name="truck")
@SequenceGenerator(sequenceName = "truck_id_seq", allocationSize = 1, name = "my_seq_gen")
public class Truck extends AuditableBaseClass {
... some attributes
}
可能重复的可能重复的i有相同的问题,但在我们的系统中,每个表都有不同的序列生成器,@GeneratedValue中的生成器值不是常量。在这种情况下该怎么办?我有同样的问题,但在我们的系统中,每个表都有不同的序列生成器,@GeneratedValue中的生成器值不是常量。在这种情况下该怎么办?