2 pièce(s) jointe(s)
Hibernate ManyToOne avec une contrainte unique
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:
Pièce jointe 628039
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:
Code:
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; |
et
Code:
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; |
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:
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:
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.
Code:
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 |
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à.
Si vous avez une piste, merci d'avance.