2013-02-22 68 views
6

यह मेरा संस्थाओं हैं:जेपीए कई करने वाली कई जुड़ें यौगिक कुंजी के साथ तालिका इकाई "अशक्त आईडी उत्पन्न"

public class Account extends AbstractEntity<Long> { 

    @Id 
    @SequenceGenerator(name = "accountSequence", sequenceName = "SQ_ACCOUNTS", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "accountSequence") 
    @Column(name = "ACC_ID", nullable = false) 
    private Long id; 
... 
} 

public class Integration extends AbstractEntity<Long> { 

    @Id 
    @SequenceGenerator(name = "integrationSequence", sequenceName="SQ_INTEGRATIONS", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "integrationSequence") 
    @Column(name = "INT_ID", nullable = false) 
    private Long id; 
... 
public void addIntegration(Integration integration) { 
     IntegrationAccount association = new IntegrationAccount(); 
      // This does not help 
     //association.setIntAccountsPK(new IntAccountsPK(integration.getId(), this.getId())); 
     association.setAccount(this); 
     association.setIntegration(integration); 
     this.integrationAccounts.add(association); 
     integration.getIntAccountsCollection().add(association); 
    } 
} 

और इस में शामिल होने तालिका

@Entity 
@Table(name = "INT_ACCOUNTS") 
public class IntegrationAccount { 

    @EmbeddedId 
    protected IntAccountsPK intAccountsPK; 

    @JoinColumn(name = "ACC_ID", referencedColumnName = "ACC_ID", insertable = false, updatable = false) 
    @ManyToOne 
    private Account account; 

    @JoinColumn(name = "INT_ID", referencedColumnName = "INT_ID", insertable = false, updatable = false) 
    @ManyToOne 
    private Integration integration; 
... 
} 
@Embeddable 
public class IntAccountsPK implements Serializable { 

    @Column(name = "INT_ID", nullable = false) 
    private Long intId; 

    @Column(name = "ACC_ID", nullable = false) 
    private Long accId; 
... 
} 

के लिए इकाई है और जब मैं करता हूँ : org.hibernate.id.IdentifierGenerationException:

account.addIntegrations(integrations.getTarget()); 
account.setCustomer(customer); 
accountService.save(account); 

मैं अपने लॉग की वजह से में यह मिल गया अशक्त आईडी उत्पन्न के लिए: class com.dhl.dcc.domain.IntegrationAccountAccount

मुझे इस तरह के मैपिंग के बारे में बहुत कुछ जानकारी नहीं है, क्या आप कृपया मुझे बता सकते हैं कि इस मैपिंग में सुधार कैसे करें (तालिका में शामिल होने के लिए इकाई को संरक्षित किया जाना चाहिए) और कैसे करें संबंधित एकाग्रता के साथ खाता बचाओ? धन्यवाद।

उत्तर

1

आप अपने एकीकरण खाते के लिए एक आईडी फ़ील्ड बना सकते हैं और फिर अपने दो फ़ील्ड के लिए एक अद्वितीय बाधा बना सकते हैं।

@Entity 
@Table(name = "INT_ACCOUNTS", 
     [email protected](columnNames={"ACC_ID", "INT_ID"})) 
public class IntegrationAccount { 

    @Id 
    private Long id; 

    @JoinColumn(name = "ACC_ID", referencedColumnName = "ACC_ID", insertable = false, updatable = false) 
    @ManyToOne 
    private Account account; 

    @JoinColumn(name = "INT_ID", referencedColumnName = "INT_ID", insertable = false, updatable = false) 
    @ManyToOne 
    private Integration integration; 
... 
} 

एक आकर्षण की तरह काम करता है!

+0

जैसा कि आपने कहा था, एक आकर्षण की तरह, धन्यवाद। मुझे "insertable = false, updatable false" भी निकालना पड़ा। – DominikM

9

मुझे पता है कि यह प्रश्न पहले ही हल हो चुका है लेकिन मैं स्वीकृत उत्तर से असहमत हूं। यह उत्तर तालिका INT_ACCOUNTS तालिका में एक बेकार कॉलम (नई आईडी) जोड़कर डेटामॉडल को संशोधित करता है। डाटामोडेल को संशोधित किए बिना हाइबरनेट में इस समस्या को हल करने का एक और तरीका है:

@Entity 
@Table(name = "INT_ACCOUNTS") 
public class IntegrationAccount implements Serializable { 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "INT_ID_FK") 
    private Integration integration; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "ACC_ID_FK") 
    private Account account; 
} 

@Entity 
@Table(name = "INTEGRATIONS") 
public class Integration { 

    @Id 
    @SequenceGenerator(name = "integrationSequence", sequenceName = "SQ_INTEGRATIONS", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "integrationSequence") 
    @Column(name = "INT_ID") 
    private Long id; 
} 

@Entity 
@Table(name = "ACCOUNTS") 
public class Account { 

    @Id 
    @SequenceGenerator(name = "accountSequence", sequenceName = "SQ_ACCOUNTS", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "accountSequence") 
    @Column(name = "ACC_ID") 
    private Long id; 
} 
+0

डेटामैडेल को संशोधित किए बिना समाधान बहुत बेहतर होगा। जब मैं अपने तरीके से मैं हो रही है ऐसा 'हाइबरनेट: एकीकरण में डालने (नाम) मूल्यों हाइबरनेट (?): (?) के खाते में डालने (नाम) मूल्यों सूत्र में अपवाद" मुख्य "java.lang.NullPointerException \t org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractHashCode (AbstractTypeDescriptor.java:88) \t org.hibernate.type.AbstractStandardBasicType.getHashCode पर (AbstractStandardBasicType.java:201) \t org.hibernate.type.AbstractStandardBasicType पर पर .getHashCode (AbStStandardBasicType.java:205) ' – DominikM

+0

अजीब। यह मेरे लिए पूरी तरह से काम किया। मैंने आपके मैपिंग को फिर से बनाने के लिए इस्तेमाल किए गए मैपिंग के बाकी जोड़े को जोड़ा। क्या आप मुझे अब जो त्रुटि प्राप्त कर रहे हैं, उसके बारे में मुझे और जानकारी दे सकते हैं? – overmeulen