Hibernate : non-null références de propriété a la valeur null ou transitoire de la valeur

Le Problème Est Résolu. Merci.

Maintenant, j'ai trois tables movie_information, release_company et rating.
movie_information et rating sont d'avoir une relation tout en release_company et movie_information sont d'avoir un-à-plusieurs relations.
Je suis en train de construire un CMS avec hibernate, mais j'ai trouvé que je ne suis pas en mesure de créer correctement la partie qui impliquent ces trois tables.

Voici mon code

MovieInformation.java

public class MovieInformation {
    private ReleaseCompany releaseCompany;
    private Rating rating;
    //Other data member
    //Constructor, getter and setter
    public ReleaseCompany getReleaseCompany(){
        ReleaseCompany newReleaseCompany = new ReleaseCompany(this.releaseCompany);
        return newReleaseCompany;
    }
    public Rating getRating(){
        Rating newRating = new Rating(this.rating);
        return newRating;
    }
    public void setReleaseCompany(ReleaseCompany releaseCompany){
        this.releaseCompany = new ReleaseCompany(releaseCompany);
    }
}

ReleaseCompany.java

public class ReleaseCompany {
    private int releaseCompanyId;
    private String releaseCompanyName;

    private Set<MovieInformation> movies = new HashSet<MovieInformation>();

    public ReleaseCompany(){
    }
    public ReleaseCompany(String releaseCompanyName){
        this.releaseCompanyName = releaseCompanyName;
    }
    public ReleaseCompany(ReleaseCompany releaseCompany){
        this.releaseCompanyName = releaseCompany.getReleaseCompanyName();
    }
    public Set<MovieInformation> getMovies() {  
        Set<MovieInformation> newMoviesSet = new HashSet<MovieInformation>(movies);
        return newMoviesSet;  
    }  
    public void setMovies(Set<MovieInformation> movies) {  
        this.movies = new HashSet<MovieInformation>(movies);
    }  
    //Other constructor, getter and setter
}

Rating.java

public class Rating {
    private MovieInformation movie;
    //other data member

    public void setMovie(MovieInformation movie){
        this.movie = new MovieInformation(movie);
    }
    //other constructor, getter and setter
}

MovieInformation.hbm.xml

<class name="cart.hibernate.movieInformation.MovieInformation" table="movie_information">
    <id column="move_id" name="movieId" type="long">
        <generator class="native"/>
    </id>

    <one-to-one name="rating" class="cart.hibernate.rating.Rating" cascade="save-update"></one-to-one> 

    <many-to-one name="releaseCompany" class="cart.hibernate.releaseCompany.ReleaseCompany"  unique="false"><!-- constrained="true" -->
        <column name="release_company_id" not-null="true" />
    </many-to-one>
    //Other property
</class>

Rating.hbm.xml

<class name="cart.hibernate.rating.Rating" table="rating">
  <id name="movieId" type="java.lang.Long">
      <column name="movie_id" />
      <generator class="foreign">
          <param name="property">movie</param>
      </generator>
  </id>

  <property column="avg_rate" name="avgRate" type="double"/>
  <property column="num_of_rate" name="numOfRate" type="long"/>

  <one-to-one name="movie" class="cart.hibernate.movieInformation.MovieInformation" constrained="true"></one-to-one>
</class>

ReleaseCompany.hbm.xml

<class name="cart.hibernate.releaseCompany.ReleaseCompany" table="release_company">
    <id column="release_company_id" name="releaseCompanyId" type="int">
        <generator class="native"/>
    </id>
    <property column="release_company_name" name="releaseCompanyName" type="string"/>

    <set name="movies" table="movie_information" inverse="true" lazy="true" fetch="select">
        <key>
            <column name="movie_id" not-null="true" />
        </key>
        <one-to-many class="cart.hibernate.movieInformation.MovieInformation" />
    </set>
</class>

Principal des tests de la méthode

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
tx = session.beginTransaction();

Rating rating = new Rating(5.6, 80);
ReleaseCompany releaseCompany = new ReleaseCompany();
releaseCompany.setReleaseCompanyName("a");
session.save(releaseCompany);        

// ReleaseCompany releaseCompany = (ReleaseCompany)session.get(ReleaseCompany.class, 15); 
// Another testing case that I have tried. It throw another exception,
// if you need the information in this part, please let me know.

MovieInformation movie = new MovieInformation("Matrix", 150, 1, 50, date, releaseDate, "good description");
movie.setRating(rating);
movie.setReleaseCompany(releaseCompany);

rating.setMovie(movie);

session.save(movie);  //<--- Error occur here
tx.commit();

StackTrace

org.hibernate.PropertyValueException: not-null property references a null or transient value: cart.hibernate.movieInformation.MovieInformation.releaseCompany
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:312)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
    at cart.hibernate.movieInformation.ManageMovieInformation.main(ManageMovieInformation.java:61)
BUILD SUCCESSFUL (total time: 1 second)

J'ai lu plusieurs question similaire, certains des les gens, a déclaré le releaseCompany(dans mon cas) de l'objet n'est pas enregistré dans la base de données de sorte que le setReleaseCompany() ne peut pas fonctionner comme prévu. Je ne suis pas sûr de savoir si le releaseCompany objet existe ou pas parce que je ne vois pas l'enregistrement dans la base de données MySql(je ne suis pas sûr que l'enregistrement sera sauvegardé ou pas, si des exceptions sont levées). En outre, certains d'entre eux, a déclaré l'attribut de la cartographie de la balise n'est pas correct, mais je ne suis pas sûr que le mien est correct ou non.

J'ai des excuses à mettre autant de code dans le post, l'espoir que vous pourriez résoudre ce problème.

Vous ne pouvez pas créer un nouvel Objet dans les getter/setter. Le problème est certainement là.
Vous avez raison, mais y aurait-il aucun problème comme peu profondes de la copie dans le Jeu<MovieInformation> getter ou un setter si pas la création d'un nouvel objet? Donc, je dois effacer le Set<> exemple et ajouter toute valeur à l'argument du jeu dans le Jeu<> exemple dans l'incubateur?
Pourriez-vous nous raconter comment vous résoudre le problème?

OriginalL'auteur Biboo Chung | 2013-11-27