IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Persistance des données Java Discussion :

Hibernate ManyToOne avec une contrainte unique


Sujet :

Persistance des données Java

  1. #1
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut 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:
    Nom : Categorys.png
Affichages : 354
Taille : 6,6 Ko
    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 : 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;
    et

    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;
    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
    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.

    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
    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.
    Images attachées Images attachées  

Discussions similaires

  1. Ajouter une contrainte UNIQUE à une clé
    Par Linio dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/06/2007, 13h36
  2. Mettre un intervall avec une contrainte check
    Par vodevil dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/12/2006, 06h32
  3. [Hibernate] Set avec une seule valeur
    Par neuromencien dans le forum Hibernate
    Réponses: 6
    Dernier message: 15/05/2006, 16h49
  4. [Hibernate] Surrogate key et contraintes unique
    Par mauvais_karma dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/11/2005, 16h41
  5. Requête SQL avec une réponse unique
    Par Glutinus dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/07/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo