有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您可以做以下更改并重试吗

    Country实体中存在映射问题,mappedBy字段设置为state,这将创建一个额外的外键。请更新如下

    @OneToMany(mappedBy = "country", cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    private List<State> state = new ArrayList<State>();
    

    由于您正在使用CountryState实体之间的双向@OneToMany关系,因此以下所有方法都适用于Country实体

    public void addState(State st) {
        state.add(st);
        st.setCountry(this);
    }
    
    public void removeState(State st) {
        state.remove(st);
        st.setCountry(null);
    }
    

    现在在Application.java中进行以下更改

    Country country = new Country("India","IN");
    State state= new State("Delhi","DL");
    City city = new City("New Delhi",true,true,"DL","IN");
    
    session.save(city);
    
    state.getCity().add(city);
    country.addState(state);
    
    session.save(country);
    
    t.commit();
    session.close();
    sessionFactory.close();