2010-09-21 13 views
0

J'ai un modèle d'héritage à plusieurs niveaux dans JPA qui utilise la stratégie rejointImposer FK contraintes lors des inserts JPA objets hérités

@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 avec des classes d'enfants

Mais chaque fois que je tente d'insérer, le la base de données DB2 sous-jacente renvoie une erreur de contrainte FK car le PK de PartyOrg est également un FK pointant vers Party.

Cela signifie que JPA doit persiste et rincer Parti avant de tenter de persister PartyOrg. (Je l'ai vérifié avec manul SQl que l'insertion d'un PartyOrg sans parti est la cause de l'erreur. Insérer Party, puis un PartyOrg (avec la même ID) fonctionne très bien.

SO

Comment puis-je dire JPA persister des classes de niveau supérieur d'abord à respecter la contrainte FK sur les enfants classes/tables.

Répondre

0

a découvert le problème!

la base de données DB2 est en utilisant des flotteurs pour PKs. Quand mon DBA dit « utilisation flotte » Je ne cessais de Considérez la discordance entre le monde de DB et le monde de Java. Il s'avère que les "flottants" de DB2 devraient à leur tour appeler des doubles de Java. Après avoir converti toutes mes clés en doubles, tout fonctionne.

Je ne peux que deviner que les problèmes d'arrondi dans les flotteurs ont causé discordances FK - mais est pure spéculation.