मैं निम्नलिखित इकाई वर्गों के साथ एक द्विदिश एक-से-कई संबंध हैं:जेपीए: इकाई बनी रहती है और विलय सोपानी बच्चे संस्थाओं
0 या 1 ग्राहक < -> 0 या अधिक उत्पाद आदेश
क्लाइंट इकाई को बनाए रखने पर मैं संबंधित उत्पाद ऑर्डर इकाइयों को भी जारी रखना चाहता हूं (क्योंकि "मूल" क्लाइंट को उनकी विदेशी कुंजी अपडेट हो सकती है)।
बेशक सभी आवश्यक कैस्केड विकल्प क्लाइंट साइड पर सेट हैं। यदि एक नव निर्मित ग्राहक पहली बार के लिए एक समान होती है, जबकि इस परिदृश्य में के रूप में एक मौजूदा उत्पाद आदेश संदर्भित लेकिन यह काम नहीं करता:
- उत्पाद आदेश '1' बनाया है और एक समान होती है। ठीक काम करता है।
- क्लाइंट '2' बनाया गया है और उत्पाद ऑर्डर '1' को इसके उत्पाद ऑर्डर सूची में जोड़ा गया है। फिर यह जारी है। काम नहीं करता।
मैंने कई apporaches की कोशिश की, लेकिन उनमें से कोई भी अपेक्षित परिणाम दिखाया। नीचे उन परिणामों को देखें। मैंने यहां सभी संबंधित प्रश्न पढ़े, लेकिन उन्होंने मेरी मदद नहीं की। मैं ग्लासफ़िश 3.1.2 पर अपाचे डर्बी (जावाडीबी) इन-मेमोरी डीबी पर लेनदेन प्रकार के रूप में एक्लिप्ससेंक 2.3.0, शुद्ध जेपीए 2.0 एनोटेशन और जेटीए का उपयोग करता हूं। इकाई संबंध एक जेएसएफ जीयूआई द्वारा प्रबंधित किया जाता है। ऑब्जेक्ट लेवल रिलेशनशिप मैनेजमेंट काम करता है (लगातार रहने के अलावा), मैंने इसे जुनीट परीक्षणों के साथ परीक्षण किया।
दृष्टिकोण 1) "डिफ़ॉल्ट" (NetBeans वर्ग टेम्प्लेट के आधार पर)
ग्राहक:
@Entity
public class Client implements Serializable, ParentEntity {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "client", cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH},
fetch= FetchType.LAZY)
private List<ProductOrder> orders = new ArrayList<>();
// other fields, getters and setters
}
ProductOrder:
@Entity
public class ProductOrder implements Serializable, ChildEntity {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne // owning side
private Client client;
// other fields, getters and setters
}
जेनेरिक हठ फसाड:
// Called when pressing "save" on the "create new..." JSF page
public void create(T entity) {
getEntityManager().persist(entity);
}
// Called when pressing "save" on the "edit..." JSF page
public void edit(T entity) {
getEntityManager().merge(entity);
}
परिणाम:
चेतावनी:: एक सिस्टम अपवाद EJB ClientFacade पद्धति पर एक मंगलाचरण के दौरान हुई सार्वजनिक शून्य javaee6test.beans.AbstractFacade.create (java.lang
(बनाने) इस अपवाद immediatly फेंकता .Object) javax.ejb.EJBException: लेन-देन निरस्त किया गया ...
की वजह से: javax.transaction.RollbackException: लेन-देन रोलबैक के लिए चिह्नित किया। ...
की वजह से: अपवाद [EclipseLink-4002] (ग्रहण हठ सेवाएं - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException आंतरिक अपवाद: java.sql। SQLIntegrityConstraintViolationException: राज्य-वस्तु को निरस्त कर दिया गया था क्योंकि इससे 'PRODUCTORDER' पर परिभाषित 'SQL120513133540930' द्वारा एक अद्वितीय या प्राथमिक कुंजी बाधा या अद्वितीय सूचकांक में डुप्लिकेट कुंजी मान उत्पन्न होता।त्रुटि कोड: -1 कॉल: उत्पादक में प्रवेश (आईडी, CLIENT_ID) मूल्य (?,?) बाइंड => [2 पैरामीटर बाध्य] क्वेरी: InsertObjectQuery (javaee6test.model.ProductOrder [id = 1]) ...
की वजह से: java.sql.SQLIntegrityConstraintViolationException: बयान निरस्त कर दिया गया है क्योंकि यह एक अद्वितीय या प्राथमिक कुंजी बाधा या अद्वितीय सूचकांक 'SQL120513133540930' 'प्रो पर परिभाषित द्वारा की पहचान में एक नकली चाबी मूल्य उत्पन्न कर DUCTORDER '। ...
की वजह से: org.apache.derby.client.am.SqlException: बयान निरस्त कर दिया गया होना कारण यह एक अद्वितीय या प्राथमिक कुंजी चोर-straint में एक नकली चाबी मूल्य उत्पन्न कर या 'PRODUCTOR-DER' पर परिभाषित 'SQL120513133540930' द्वारा पहचाना गया अद्वितीय सूचकांक।
मुझे यह अपवाद नहीं समझा। संपादित करें() ठीक काम करता है। लेकिन मैं अपने निर्माण समय पर किसी ग्राहक को उत्पाद आदेश जोड़ना चाहता हूं, इसलिए यह अपर्याप्त है।
दृष्टिकोण 2) विलय() केवल
जेनेरिक हठ फसाड में परिवर्तन:
// Called when pressing "save" on the "create new..." JSF page
public void create(T entity) {
getEntityManager().merge(entity);
}
// Called when pressing "save" on the "edit..." JSF page
public void edit(T entity) {
getEntityManager().merge(entity);
}
परिणाम:
पर (बनाने), EclipseLink लॉगिंग उत्पादन का कहना है:
ठीक है: ग्राहक में आईडी (आईडी, NAME, ADDRESS_ID) मूल्य (?, ?,?) बाइंड => [3 पैरामीटर बाध्य]
लेकिन उत्पाद आदेश तालिका पर कोई "अद्यतन" नहीं। इस प्रकार, संबंध स्थापित नहीं है। फिर, संपादित करें(), दूसरी ओर, ठीक काम करता है।
apporach 3) आईडी GenerationType.IDENTITY दोनों इकाई प्रकार दोनों क्लाइंट और उत्पाद आदेश वर्ग के लिए
परिवर्तन पर:
...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
परिणाम:
पर (बनाने), EclipseLink लॉगिंग आउटपुट कहता है:
ठीक है: INSERT I Nto ग्राहक (नाम, ADDRESS_ID) मान बाँध => [2 मापदंडों बाध्य]
ललित (,?): मान IDENTITY_VAL_LOCAL()
ललित: PRODUCTORDER (ORDERDATE, CLIENT_ID) मान में डालें (? ,?) बाँध => [2 मापदंडों बाध्य]
ललित: मान IDENTITY_VAL_LOCAL()
इस प्रकार के बजाय ग्राहक की सूची में जोड़ा उत्पाद क्रम में एक रिश्ता estabilshing की, एक नया prodcut आदेश इकाई बनाई गई है और जारी (!) और उस इकाई के साथ संबंध estabilshed है। यहां वही, संपादित करें() ठीक काम करता है।
apporach 4) दृष्टिकोण (2) और (3) संयुक्त
परिणाम: दृष्टिकोण के रूप में एक ही (2)।
मेरा प्रश्न है: क्या ऊपर वर्णित परिदृश्य को समझने का कोई तरीका है? यह कैसे पहुंचा जा सकता है? मैं जेपीए (कोई विक्रेता-विशिष्ट समाधान) के साथ रहना चाहता हूं।
नहीं, यह काम नहीं करता है। यह वास्तव में कुछ भी नहीं बदलता है। मैंने इसे '@ जॉइन कॉलम (नाम = "CLIENT_ID", संदर्भित कॉलमनाम = "आईडी") 'के साथ करने की कोशिश की, लेकिन यह काम नहीं किया। – SputNick