다음과 같은 종류의 최대 절전 모드 엔터티 계층 클래스가 있습니다. 나는 두 개의 구체적인 서브 클래스 인 Sub1Class
과 Sub2Class
을 가지고있다. 이들은 MappedSuperClass
에 정의 된 판별 자 열 (field
)으로 구분됩니다. 다른 엔터티가 참조하는 추상 엔터티 클래스 EntitySuperClass
이 있습니다. 다른 엔터티는 실제로 Sub1Class
또는 Sub2Class
을 참조하는지는 신경 쓰지 않아야합니다.Hibernate, 단일 테이블 상속 및 식별자 클래스로 슈퍼 클래스의 필드 사용
실제로 가능한가요? (열 정의가 EntitySuperClass Sub1Class과 두 번 상속되기 때문에) 현재이 오류를 얻을 :
Repeated column in mapping for entity: my.package.Sub1Class column: field (should be mapped with insert="false" update="false")
내가 hiberante에서 @MappedSuperClass
EntitySuperClass
에, 그럼 내가 얻을 주장의 오류를 추가하는 경우 : 클래스가 모두있는 경우는 좋아하지 않는다 엔티티와 매핑 된 수퍼 클래스. 내가 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;
}
}
:
당신이 최종 엔티티 객체에 필요한 경우, 하나의 좋은 방법은 판별 값에서 열거를 구현하고 @Transient 필드에 저장 위치를 반환 할 수 있습니다 기둥? 이 열은 일반적으로 노출하지 않으려는 "숨겨진"구현 세부 정보입니다. –
discriminator 열은 이미 외부 패키지의 일부인 MappedSuperClass에 노출되어 있습니다. 가능한 경우 수정하지 않으려는 패키지. –