有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate,单表继承,并使用超类中的字段作为鉴别器列

对于hibernate实体层次结构,我有以下几种类。我试图有两个具体的子类Sub1ClassSub2Class。它们由MappedSuperClass中定义的鉴别器列(field)分隔。有一个抽象实体类EntitySuperClass,它被其他实体引用。其他实体不应该关心它们是否实际引用了Sub1ClassSub2Class

这真的可能吗?目前我遇到了这个错误(因为列定义在Sub1类和EntitySuperClass中被继承了两次):

Repeated column in mapping for entity: my.package.Sub1Class column: field (should be mapped with insert="false" update="false")

如果我将@MappedSuperClass添加到EntitySuperClass,那么我会从Hibernate获得断言错误:它不喜欢一个类既是实体又是映射的超类。如果我从EntitySuperClass中删除@Entity,则该类不再是实体,不能从其他实体引用:

MappedSuperClass是外部包的一部分,因此如果可能,不应更改

我的课程:

@MappedSuperclass
public class MappedSuperClass {
    private static final String ID_SEQ = "dummy_id_seq";
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_SEQ)
    @GenericGenerator(name=ID_SEQ, strategy="sequence")

    @Column(name = "id", unique = true, nullable = false, insertable = true, updatable = false)
    private Integer id;

    @Column(name="field", nullable=false, length=8)
    private String field;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
}


@Entity
@Table(name = "ACTOR")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="field", discriminatorType=DiscriminatorType.STRING)
abstract public class EntitySuperClass extends MappedSuperClass {


    @Column(name="description", nullable=false, length=8)
    private String description;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

@Entity
@DiscriminatorValue("sub1")
public class Sub1Class extends EntitySuperClass {

}


@Entity
@DiscriminatorValue("sub2")
public class Sub2Class extends EntitySuperClass {

}


@Entity
public class ReferencingEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

    @Column
    private Integer value;

    @ManyToOne
    private EntitySuperClass entitySuperClass;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

    public EntitySuperClass getEntitySuperClass() {
        return entitySuperClass;
    }

    public void setEntitySuperClass(EntitySuperClass entitySuperClass) {
        this.entitySuperClass = entitySuperClass;
    }

}

共 (0) 个答案