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 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
Vous devez vous connecter pour publier un commentaire.
Faire simple :
Veuillez noter que
setMovies(Set movies)
est privé, donc la seule façon de changer tous les films est de faire quelque chose comme ceci:Vous avez besoin parce que:
Set
par un autre, implique que la veille prolongée proxy sera perduOriginalL'auteur ben75