Java 继承:将超类的@Id注释为具有不同序列的子类

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

我正在将旧项目(核心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 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 Mihalcea

Hibernate 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中的生成器值不是常量。在这种情况下该怎么办?