मेरे पास हाइबरनेट इकाई पदानुक्रम के लिए निम्न प्रकार के वर्ग हैं। मैं दो ठोस उप वर्ग Sub1Class
और Sub2Class
रखने की कोशिश कर रहा हूं। वे एक भेदभावकर्ता कॉलम (field
) से अलग होते हैं जिन्हें MappedSuperClass
में परिभाषित किया गया है। एक अमूर्त इकाई वर्ग EntitySuperClass
है जिसे अन्य संस्थाओं द्वारा संदर्भित किया जाता है। अन्य संस्थाओं को परवाह नहीं करना चाहिए यदि वे वास्तव में Sub1Class
या Sub2Class
का संदर्भ दे रहे हैं।हाइबरनेट, सिंगल टेबल विरासत और सुपरक्लास से फील्ड का उपयोग भेदभावकर्ता कॉलम
यह वास्तव में संभव है? वर्तमान में मैं इस त्रुटि मिलती है (क्योंकि स्तंभ परिभाषा Sub1Class में और EntitySuperClass में दो बार विरासत में मिलती है):
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;
}
}
लेकिन तुम क्यों discriminator बेनकाब करना चाहते हैं स्तंभ? यह कॉलम आम तौर पर एक "छुपा" कार्यान्वयन विवरण है जिसे आप बेनकाब नहीं करना चाहते हैं। –
भेदभावकर्ता कॉलम पहले से ही मैप्डसुपर क्लास में उजागर हुआ है जो बाहरी पैकेज का हिस्सा है। यदि संभव हो, तो मैं एक पैकेज को संशोधित करना चाहता हूं। –