Bonjour a tous,
Je suis sur un projet avec Hibernate qui utilise deux bases de données en ManyToOne avec une contraint unique sur un champs d'une des deux table, voici mon MCD:
Le champ avec la contrainte unique est le champs name, donc si ma valeur dans name existe, il ne faut pas que j'enregistre de données dans cette table, mais que j'ebregistre les données dans l'autre table avec la valeur de clé étrangere correspondante.
voici mes Entity:
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 @Entity @Table(name = "article") public class ArticleEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(length = 200,nullable = false) private String title; @Column(columnDefinition = "TEXT",nullable = false) private String body; @Column(length = 50,nullable = false) private String auteur; @ManyToOne(optional = false) //Many article One category private CategoryEntity category;
Puis dans mon code j'ai essayer de n'enregistrer que les données dans la premiere table,si la valeur name existait déjà:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Entity @Table(name="category") public class CategoryEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(length = 64,unique = true,nullable = false) private String name; @OneToMany private Collection<ArticleEntity> articles;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ArticleEntity blog1 = new ArticleEntity(num3, titre, corp, nomAuteur, null); CategoryEntity cat1 = new CategoryEntity(null,"appartement"); for (CategoryEntity c:categoryService.findAll()){ if (c.getName()==cat1.getName()){ blog1.setCategory(cat1); articleService.insertMaJ(blog1); count=1; } } if (count==0) { cat1 = categoryService.insert(cat1); blog1.setCategory(cat1); articleService.insertMaJ(blog1); }
mais j'ai une erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 oct. 29, 2022 4:10:54 PM org.hibernate.action.internal.UnresolvedEntityInsertActions logCannotResolveNonNullableTransientDependencies WARN: HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities. Unsaved transient entity: ([fr.webforce.entities.CategoryEntity#<null>]) Dependent entities: ([[fr.webforce.entities.ArticleEntity#<null>]]) Non-nullable association(s): ([fr.webforce.entities.ArticleEntity.category]) Exception in thread "main" java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : fr.webforce.entities.ArticleEntity.category -> fr.webforce.entities.CategoryEntity at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:161) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:175) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:182) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:839) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:814) at fr.webforce.services.ArticleService.insertMaJ(ArticleService.java:23) at fr.webforce.Main.main(Main.java:57) Caused by: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : fr.webforce.entities.ArticleEntity.category -> fr.webforce.entities.CategoryEntity at org.hibernate.action.internal.UnresolvedEntityInsertActions.checkNoUnresolvedActionsAfterOperation(UnresolvedEntityInsertActions.java:121) at org.hibernate.engine.spi.ActionQueue.checkNoUnresolvedActionsAfterOperation(ActionQueue.java:441) at org.hibernate.internal.SessionImpl.checkNoUnresolvedActionsAfterOperation(SessionImpl.java:585) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:829) ... 3 more
J'ai vu que ça devait etre ça la solution, mais je ne comprend pas ce que je dois faire pour corriger le problème.
Je me permet d'ajouter que tout fonctionne correctement lors de la première insertion dans les bases de données ou quand le "name" de "category" change, mais pas quand le "name" de "category" existe déjà.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Not-null property references a transient value - transient instance must be saved before current operation : fr.webforce.entities.ArticleEntity.category -> fr.webforce.entities.CategoryEntity
Si vous avez une piste, merci d'avance.
Partager