views:

23

answers:

1

I have a multilevel inheritance model in JPA that is using the joined strategy

@Entity
@Table(name="PARTY")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="PARTY_TYPE",discriminatorType=DiscriminatorType.STRING)
public class Party implements Serializable{
...
}

@Entity
@Table(name="PARTY_ORG")
@DiscriminatorValue(value="PARTY_ORG") // value in party table's PARTY_TYPE column that dictates an Org.
@PrimaryKeyJoinColumn(name="AFF_PARTY_ORG_ID")
//how children clients and orgs willmap to us.
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="ORG_TYPE_CD")
public class PartyOrg extends Party implements Serializable{
....
}

..continues with children classes

But whenever I try to insert, the underlying DB2 databse throws a FK constraint error because the PK of PartyOrg is also a FK pointing to Party.

That means that JPA must persists and flush Party before it attempts to persist PartyOrg. (I have verified with manul SQl that inserting a PartyOrg without a Party is the cause of the error. Inserting Party first, then a PartyOrg (with same ID) works fine.

SO

How can I tell JPA to persist top level classes first to respect the FK constraint on children classes/tables.

A: 

Discovered the problem!

The DB2 database is using floats for PKs. When my DBA said "use floats" I never stopped to consider the mismatch between DB world and Java world. Turns out that DB2 "floats" should in turn call for Java doubles. After I converted all my keys to doubles, everything works.

I can only guess that rounding issues in the floats caused FK mismatches - but that is pure speculation.

Eddie