10
votes

Ouvrir la sauvegarde JPA OneTomanany, clé étrangère non définie

J'ai deux tables: Tastock et Tastockprice. TASTOCKID TASTOCKID DANS LE TAXTOCKPRICE est la clé étrangère pour table Tastock.

@Test
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createTaStock() throws Exception {
    TaStock taStock = new TaStock();
             ...

    TaStockPrice taStockPrice = new TaStockPrice();
             ...

    taStock.addTaStockPrice(taStockPrice);
    taStockService.persist(taStock);
}


1 commentaires

Pourquoi avez-vous besoin de la définition de colonne astockid ? JPA ne fonctionne pas comme ceci, vous pouvez vous référer à la clé étrangère par tastockprice.gettastock (). Getid () .


4 Réponses :


3
votes

Vous définissez la collection comme n'étant pas inséréable ni mise à jour. De cette façon, l'hibernate ne le persistera jamais.

Vous pouvez définir comment Hibernate devrait traiter cette relation à l'aide du paramètre CASCADE dans votre annotation. Pour plus d'informations, voici un article de blog complet sur le sujet: http://www.mkyong.com/hibernate/ibernate-cascade-example-save-update-delete-and-Delete-orphan/ .


4 commentaires

Bonjour, j'ai eu l'air d'attirer l'exemple sur www.mkyong.com. Pour être synchrone avec l'exemple, il suffit d'ajouter la déclaration Tastockprice.SetTastock (Tastock); . La collection est insérable / mise à jour car j'ai annoté la collection avec: cascade = cascadetype.all. J'ai toujours le même message d'exception.


Avec ma configuration actuelle, Hibernate ne semble pas définir de champ astockid. Comment puis-je vous assurer que l'hibernate a reconnu Tastockid comme clé étrangère et définit ce champ lors de la sauvegarde de Tastock?


TASTOCKPRICE DE TATEAU DB, le champ suivant est défini "TastockID Integer non null", et la contrainte suivante: Contrainte Tastockprice_tastockid_fkey Touche étranger (Tastockid) Références Tastock (ID) Match simple sur la mise à jour Cascade sur la cascade de Supprimer


Je devais définir insérable = false, mise à jour = false sur la définition de la colonne enfant pour que l'insertion en cascade fonctionne.



8
votes

i supprimé integer privé tsockid " de tastockprice et modifié @JOINCOLUMN (NAME = "TASTOCKID", NULLLABLE = FALSE, UPDABLE = FALSE, INSERTABLE = TRUE) Pour le résoudre.


1 commentaires

Merci beaucoup, cela m'a également résolu pour moi. Avez-vous une explication sur la manière dont le réglage inséré dans TRUE résout le problème? Merci!



2
votes

Utilisez ci-dessous Annotation sur TastockPricelist .

@ONETOMANY
@cascade (cascadetype.all)
@JOINCOLUMN (nom = "tsock")

qui devrait résoudre le problème.


1 commentaires

Merci. J'ai eu la contallation @onetoone et eu le même problème. J'ai supprimé nullable = false, mise à jour = false et cela a résolu mon problème.



2
votes

Pour activer la possibilité d'économiser sur un @Eonetomany par exemple xxx

alors vous devez dire à votre @manytoone relation est autorisé à mettre à jour MyTable comme cette mise à jour de cette mise à jour = true xxx


0 commentaires