[ https://issues.apache.org/jira/browse/OPENJPA-2929?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Pawel Veselov updated OPENJPA-2929: ----------------------------------- Description: Say you have entity A that has a reference to entity B. Say entity B is identified by a compound key {code:java} @Entity public class A { @Id private long id; @JoinColumns({ @JoinColumn(name = "b_id1", referencedColumnName = "id1"), @JoinColumn(name = "b_id2", referencedColumnName = "id2") }) private B b; @Column( name = "b_id1", insertable = false, updatable = false ) private String bId2; @Column( name = "b_id2", insertable = false, updatable = false ) private String bId2; } @Entity @IdClass(ID2.class) public class B { @Id @Column("id1") private String id1; @Id @Column("id2") private String id2; } public class ID2 { private String id1; private String id2; public ID2() {} public ID2(String id1, String id2) { this.id1 = id1; this.id2 = id2; } } {code} After calling {{a.setB(b)}}, and calling {{em.persist(a)}}, the values of {{a.bId1}} and {{a.bId2}} are either not set, or set to the same value, either from {{b.id1}} or from {{b.id2}}. This is because {{RowImpl.setJoinRefColumn()}} sets values for all A’s columns that point to B for every B primary key columns. was: Say you have entity A that has a reference to entity B. Say entity B is identified by a compound key {code:java} @Entity public class A { @Id private long id; @JoinColumns({ @JoinColumn(name = "b_id1", referencedColumnName = "id1"), @JoinColumn(name = "b_id2", referencedColumnName = "id2") }) private B b; @Column( name = "b_id1", insertable = false, updatable = false ) private String bId2; @Column( name = "b_id2", insertable = false, updatable = false ) private String bId2; } @Entity @IdClass(ID2.class) public class B { @Id @Column("id1") private String id1; @Id @Column("id2") private String id2; } public class ID2 { private String id1; private String id2; public ID2() {} public ID2(String id1, String id2) { this.id1 = id1; this.id2 = id2; } } {code} After calling {{a.setB(b)}}, and calling {{em.persist(a)}}, the values of {{a.bId1}} and {{a.bId2}} are set randomly, either from {{b.id1}} or from {{b.id2}}. This is because {{RowImpl.setJoinRefColumn()}} sets values for all A’s columns that point to B for every B primary key columns. > Filling inverse FK columns is broken for compound keys > ------------------------------------------------------ > > Key: OPENJPA-2929 > URL: https://issues.apache.org/jira/browse/OPENJPA-2929 > Project: OpenJPA > Issue Type: Bug > Components: jdbc > Affects Versions: 3.1.2, 3.2.2, 4.0.1 > Reporter: Pawel Veselov > Priority: Major > > Say you have entity A that has a reference to entity B. > Say entity B is identified by a compound key > {code:java} > @Entity > public class A { > @Id > private long id; > @JoinColumns({ > @JoinColumn(name = "b_id1", referencedColumnName = "id1"), > @JoinColumn(name = "b_id2", referencedColumnName = "id2") > }) > private B b; > @Column( > name = "b_id1", > insertable = false, > updatable = false > ) > private String bId2; > @Column( > name = "b_id2", > insertable = false, > updatable = false > ) > private String bId2; > } > @Entity @IdClass(ID2.class) > public class B { > @Id @Column("id1") > private String id1; > @Id @Column("id2") > private String id2; > } > public class ID2 { > private String id1; > private String id2; > public ID2() {} > public ID2(String id1, String id2) { > this.id1 = id1; > this.id2 = id2; > } > } > {code} > After calling {{a.setB(b)}}, and calling {{em.persist(a)}}, the values of > {{a.bId1}} and {{a.bId2}} are either not set, or set to the same value, > either from {{b.id1}} or from {{b.id2}}. > This is because {{RowImpl.setJoinRefColumn()}} sets values for all A’s > columns that point to B for every B primary key columns. -- This message was sent by Atlassian Jira (v8.20.10#820010)