2013-02-22 45 views
6

này là các đơn vị của tôi:JPA Nhiều-to-Nhiều Tham bảng thực thể có chìa khóa hợp chất "id rỗng tạo ra"

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

Và đây là thực thể cho tham gia bảng

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

Và khi tôi làm :

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

tôi nhận này trong nhật ký của tôi Nguyên nhân: org.hibernate.id.IdentifierGenerationException: id rỗng tạo cho: class com.dhl.dcc.domain.IntegrationAccount

Tôi không có nhiều kiến ​​thức về loại ánh xạ này, bạn có thể vui lòng cho tôi biết cách cải thiện ánh xạ này (thực thể cho bảng kết nối phải được giữ nguyên) và cách lưu tài khoản với tích hợp liên quan? Cảm ơn.

Trả lời

1

Bạn có thể tạo trường ID cho IntegrationAccount của bạn và sau đó tạo một ràng buộc duy nhất cho hai trường của bạn.

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

Hoạt động như một sự quyến rũ!

+0

Như một sự quyến rũ như bạn đã nói, cảm ơn bạn. Tôi đã phải loại bỏ "insertable = false, updatable false". – DominikM

9

Tôi biết câu hỏi này đã được đánh dấu là đã được giải quyết nhưng tôi không đồng ý với câu trả lời được chấp nhận. Câu trả lời này sửa đổi datamodel bằng cách thêm một cột vô ích (id mới) trong bảng INT_ACCOUNTS. Có một cách khác để giải quyết vấn đề này trong Hibernate mà không sửa đổi datamodel:

@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

Giải pháp mà không sửa đổi datamodel sẽ tốt hơn nhiều. Khi tôi làm theo cách của bạn, tôi đang nhận được 'Hibernate: chèn vào giá trị tích hợp (tên) (?) Hibernate: chèn vào tài khoản (tên) giá trị (?) Ngoại lệ trong chuỗi" main "java.lang.NullPointerException \t tại org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractHashCode (AbstractTypeDescriptor.java:88) \t tại org.hibernate.type.AbstractStandardBasicType.getHashCode (AbstractStandardBasicType.java:201) \t tại org.hibernate.type.AbstractStandardBasicType .getHashCode (AbstractStandardBasicType.java:205) ' – DominikM

+0

Lạ. Nó làm việc hoàn hảo cho tôi. Tôi đã thêm phần còn lại của ánh xạ mà tôi đã sử dụng để tạo lại trường hợp thử nghiệm của bạn. Bạn có thể cho tôi biết thêm thông tin về lỗi bạn đang nhận được ngay bây giờ không? – overmeulen

Các vấn đề liên quan