java notnull属性引用Hibernate中的null或瞬时值错误
我正在构建一个Hibernate应用程序,在MySql数据库中存储国家、州和城市信息。但是,即使在相关实体中有空检查,我仍然会遇到Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value
这里是Country.java
package com.models;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import com.sun.istack.NotNull;
@Entity
@Table(name = "COUNTRY")
public class Country {
public Country() {
super();
// TODO Auto-generated constructor stub
}
public Country(String country, String countryCode) {
super();
this.country = country;
this.countryCode = countryCode;
}
private String country;
@Id
@NotNull
private String countryCode;
@OneToMany(mappedBy = "state", cascade = CascadeType.ALL,fetch = FetchType.LAZY)
private List<State> state = new ArrayList<State>();
public List<State> getState() {
return state;
}
public void setState(List<State> state) {
this.state = state;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
}
这里是State.java
package com.models;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "STATE")
public class State {
public State() {
super();
}
public State(String state, String statecode) {
super();
this.state = state;
this.statecode = statecode;
}
private String state;
@Id
private String statecode;
@OneToMany
List<City> city = new ArrayList<City>();
@ManyToOne
@JoinColumn(name="countryCode", nullable=false)
private Country country;
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
public List<City> getCity() {
return city;
}
public void setCity(List<City> city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getStatecode() {
return statecode;
}
public void setStatecode(String statecode) {
this.statecode = statecode;
}
}
这里是City.java
package com.models;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="CITY")
public class City {
public City() {
super();
// TODO Auto-generated constructor stub
}
public City(String city, boolean isStateCapital, boolean isCountryCapital,
String statecode, String countrycode) {
super();
this.city = city;
this.isStateCapital = isStateCapital;
this.isCountryCapital = isCountryCapital;
this.statecode = statecode;
this.countrycode = countrycode;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int cityid;
private String city;
private boolean isStateCapital;
private boolean isCountryCapital;
private String statecode;
private String countrycode;
public String getStatecode() {
return statecode;
}
public void setStatecode(String statecode) {
this.statecode = statecode;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public boolean isStateCapital() {
return isStateCapital;
}
public void setStateCapital(boolean isStateCapital) {
this.isStateCapital = isStateCapital;
}
public boolean isCountryCapital() {
return isCountryCapital;
}
public void setCountryCapital(boolean isCountryCapital) {
this.isCountryCapital = isCountryCapital;
}
public String getCountrycode() {
return countrycode;
}
public void setCountrycode(String countrycode) {
this.countrycode = countrycode;
}
}
这里是Application.java
类
package com.application;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import com.models.City;
import com.models.Country;
import com.models.State;
public class Application {
public static void main(String[] args) {
SessionFactory sessionFactory = getSessionFactory();
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
Country country = new Country("India","IN");
State state= new State("Delhi","DL");
City city = new City("New Delhi",true,true,"DL","IN");
country.getState().add(state);
state.getCity().add(city);
session.save(country);
session.save(state);
session.save(city);
t.commit();
session.close();
sessionFactory.close();
}
private static SessionFactory getSessionFactory() {
Configuration configuartion = new Configuration().configure();
configuartion.addAnnotatedClass(Country.class);
configuartion.addAnnotatedClass(State.class);
configuartion.addAnnotatedClass(City.class);
// StandardServiceRegistryBuilder registry = new StandardServiceRegistryBuilder();
// registry.applySettings(configuartion.getProperties());
// StandardServiceRegistry serviceRegistry = registry.build();
// SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
SessionFactory sessionFactory = configuartion.buildSessionFactory();
return sessionFactory;
}
}
hibernate.cfg.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">pwdrd</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/countryinfo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
我经常碰到
May 23, 2020 2:38:13 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: select state_.statecode, state_.countryCode as countryC3_2_, state_.state as state2_2_ from STATE state_ where state_.statecode=?
Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value : com.models.State.country
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:111)
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:55)
at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:116)
at org.hibernate.action.internal.AbstractEntityInsertAction.makeEntityManaged(AbstractEntityInsertAction.java:125)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:289)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:250)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:343)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:198)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:140)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:193)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:178)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:99)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:598)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:591)
at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:492)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:416)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:218)
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:525)
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:456)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:419)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:218)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:151)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:464)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:198)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:140)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:193)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:178)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:618)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:611)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:606)
at com.application.Application.main(Application.java:30)
虽然我在国家和州实体上有可为空的检查,但我有级联和获取类型惰性属性集,但它仍然没有解析。我们将非常感谢您在这方面的帮助。谢谢希德
# 1 楼答案
您可以做以下更改并重试吗
在
Country
实体中存在映射问题,mappedBy
字段设置为state
,这将创建一个额外的外键。请更新如下由于您正在使用
Country
和State
实体之间的双向@OneToMany
关系,因此以下所有方法都适用于Country
实体现在在
Application.java
中进行以下更改