2013-02-22 30 views
6

Bu benim varlıklardır "boş id oluşturulan" Üyelik:JPA Çoktan Birçok bileşik anahtar ile tablo varlık

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); 
    } 
} 

Ve bu tablo

@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; 
... 
} 

katılmak için varlıktır Ve ne zaman : org.hibernate.id.IdentifierGenerationException:

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

Ben neden Olduğu benim günlüğünde bu var sıfır kimliği oluşturulan için: sınıf com.dhl.dcc.domain.IntegrationAccount

Bu tür eşleme hakkında pek bir bilgim yok, lütfen bu eşlemenin nasıl iyileştirileceğini (birleştirme tablosunun varlığı korunmalıdır) ve nasıl yapılacağını söyler misiniz? hesabı ilgili entegrasyonlarla kaydetme Teşekkürler.

cevap

1

IntegrationAccount için bir kimlik alanı oluşturabilir ve ardından iki alan için benzersiz bir kısıtlama oluşturabilirsiniz.

@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; 
... 
} 

Bir çekicilik gibi çalışır!

+0

Dediğiniz gibi bir çekicilik gibi, teşekkür ederim. Ayrıca "insertable = false, updatable false" öğesini kaldırmam gerekiyordu. – DominikM

9

Bu sorunun zaten çözülmüş olarak işaretlendiğini biliyorum ancak kabul edilen yanıtla aynı fikirde değilim. Bu cevap, INT_ACCOUNTS tablosunda yararsız bir sütun (yeni kimlik) ekleyerek veri modelini değiştirir. Bu sorunu çözmek için başka bir yol da hazırda beklemeden başka bir yöntem de vardır:

@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

Datamodel'i değiştirmeden çözüm çok daha iyi olurdu. ı o ı alıyorum yolunuzu yaptığınızda 'kipi: bütünleşme içine yerleştirin (isim) değerleri hazırda (?) (?) dikkate insert (isim) değerleri dizisindeki "ana" java.lang.NullPointerException \t org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractHashCode (AbstractTypeDescriptor.java:88) org.hibernate.type.AbstractStandardBasicType.getHashCode de \t (AbstractStandardBasicType.java:201) \t org.hibernate.type.AbstractStandardBasicType en .getHashCode (AbstractStandardBasicType.java:205) ' – DominikM

+0

Garip. Benim için mükemmel çalıştı. Test durumunuzu yeniden oluşturmak için kullandığım haritanın geri kalanını ekledim. Şimdi aldığın hata hakkında daha fazla bilgi verebilir misin? – overmeulen