मैं एक मेज दोनों विदेशी कुंजी साथ दो अलग-अलग तालिकाओं के लिए दो विदेशी कुंजी है कि एक स्तंभ साझा करने की है:क्या हाइबरनेट विदेशी कुंजी ओवरलैप करने में सक्षम होना चाहिए?
CREATE TABLE ZipAreas
(
country_code CHAR(2) NOT NULL,
zip_code VARCHAR(10) NOT NULL,
state_code VARCHAR(5) NOT NULL,
city_name VARCHAR(100) NOT NULL,
PRIMARY KEY (country_code, zip_code, state_code, city_name),
FOREIGN KEY (country_code, zip_code) REFERENCES Zips (country_code, code),
FOREIGN KEY (country_code, state_code, city_name) REFERENCES Cities (country_code, state_code, name)
)
जैसा कि आप देख सकते हैं, वहाँ साझा करने COUNTRY_CODE (संयोग से उसी स्तंभ को संदर्भित दो FKS हैं रेफरेंसिएशन पथ का अंत)। इकाई वर्ग (जेपीए 1.0 @IdClass) की तरह दिखता है:
@Entity
@Table(name = "ZipAreas")
@IdClass(value = ZipAreaId.class)
public class ZipArea implements Serializable
{
@Id
@Column(name = "country_code", insertable = false, updatable = false)
private String countryCode;
@Id
@Column(name = "zip_code", insertable = false, updatable = false)
private String zipCode;
@Id
@Column(name = "state_code", insertable = false, updatable = false)
private String stateCode;
@Id
@Column(name = "city_name", insertable = false, updatable = false)
private String cityName;
@ManyToOne
@JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code"), @JoinColumn(name = "zip_code", referencedColumnName = "code")})
private Zip zip = null;
@ManyToOne
@JoinColumns(value = {@JoinColumn(name = "country_code", referencedColumnName = "country_code", insertable = false, updatable = false), @JoinColumn(name = "state_code", referencedColumnName = "state_code"), @JoinColumn(name = "city_name", referencedColumnName = "name")})
private City city = null;
...
}
आप देख सकते हैं मैं countryCode संपत्ति और केवल पढ़ने के लिए जैसे शहर के COUNTRY_CODE @JoinColumn चिह्नित किये (insertable = false, updatable = false)। हाइबरनेट इस कहने में विफल रहता है:
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: geoinfo] Unable to configure EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:374)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
at tld.geoinfo.Main.main(Main.java:27)
Caused by: org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed: tld.geoinfo.model.ZipAreacity
at org.hibernate.cfg.Ejb3Column.checkPropertyConsistency(Ejb3Column.java:563)
at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2703)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1600)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3977)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3931)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1368)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345)
at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1477)
at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1096)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:278)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:362)
... 4 more
यह ईमानदारी से मेरे लिए बहुत बुनियादी दिखता है। "किसी संपत्ति में डालने योग्य और गैर डालने योग्य कॉलम को मिक्स करने की अनुमति नहीं है" यह इतना कमजोर "बहाना है" है ना?
क्या हाइबरनेट इसे संभालने में सक्षम होना चाहिए, उदा। जेपीए spec के अनुसार? क्या यह एक बग है?
यहाँ एक JavaSE, HSQLDB, चींटी स्टैंडअलोन ऐप्स: http://www.kawoolutions.com/media/geoinfo-hib-overlapping -fks.zip – Kawu
हाइबरनेट समग्र प्राथमिक कुंजी को नापसंद करता है - कुछ स्थितियों में यह गड़बड़ हो जाता है। सिंगल कॉलम प्राथमिक कुंजी का उपयोग करने के लिए अपने डेटाबेस को दोबारा करने का प्रयास करें। –
हाँ हाइबरनेट समग्र कुंजी पर बेकार है। किसी भी मामले में, इसकी सूचना कभी नहीं मिली है, अब यह है: http: //opensource.atlassian।कॉम/प्रोजेक्ट/हाइबरनेट/ब्राउज/एचएचएच -6221 – Kawu