2013-02-22 17 views
6

は、これは私の実体である「ヌルIDが生成されました」 :org.hibernate.id.IdentifierGenerationException:JPAは、多対多の複合キーを持つテーブルのエンティティに参加

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

私はによって引き起こされる私のログ にこれを得たヌルIDが生成しますfor:class com.dhl.dcc.domain.IntegrationAccount

私はこの種のマッピングについて知識がありません。このマッピングを改善する方法を教えてください(結合テーブルのエンティティは保存する必要があります)。関連する統合のアカウントを保存しますか?ありがとう。

答えて

1

IntegrationAccountのIDフィールドを作成して、2つのフィールドに一意の制約を作成できます。

@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

ありがとうございました。私は "挿入可能= false、更新可能なfalse"も削除しなければならなかった。 – DominikM

9

私はこの問題がすでに解決済みとマークされていることを知っていますが、私は受け入れられた答えに同意しません。この回答は、テーブルINT_ACCOUNTSに無駄な列(新しいID)を追加してデータモデルを変更します。データモデルを変更せずにこの問題を解決する別の方法があります:

@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

データモデルを変更しないで解決する方がずっと良いでしょう。私はあなたのやり方をしているとき 'Hibernate:統合(名前)値に挿入する(?) Hibernate:アカウント(名前)の値に挿入する(?) スレッド" main "の例外java.lang.NullPointerException \t org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractHashCode(AbstractTypeDescriptor.java:88)で org.hibernate.type.AbstractStandardBasicType.getHashCodeで\t(AbstractStandardBasicType.java:201) \t org.hibernate.type.AbstractStandardBasicTypeで.getHashCode(AbstractStandardBasicType.java:205) ' – DominikM

+0

不思議です。それは私のために完璧に働いた。テストケースを再作成するために使用した残りのマッピングを追加しました。あなたは私が今得ているエラーについての詳細を教えてくれますか? – overmeulen

関連する問題