Java Hibernate属性引用了null

Java Hibernate属性引用了null,java,hibernate,persistence,Java,Hibernate,Persistence,我对Hibernate有一个问题:我有两个实体Libro和editor,它们之间有多对一的关系。当我尝试持久化时,会出现以下错误: Hibernate:从编辑性编辑中选择编辑性编辑,编辑性编辑的名称为NOMBRE4,编辑性编辑的名称为ID3,编辑性编辑的名称为NIF4,编辑性编辑的名称为NIF4? org.hibernate.PropertyValueException:notnull属性引用空值或瞬时值:app.modelo.Libro.editive 位于org.hibernate.engi

我对Hibernate有一个问题:我有两个实体Libro和editor,它们之间有多对一的关系。当我尝试持久化时,会出现以下错误:

Hibernate:从编辑性编辑中选择编辑性编辑,编辑性编辑的名称为NOMBRE4,编辑性编辑的名称为ID3,编辑性编辑的名称为NIF4,编辑性编辑的名称为NIF4? org.hibernate.PropertyValueException:notnull属性引用空值或瞬时值:app.modelo.Libro.editive 位于org.hibernate.engine.Nullability.checkNullability(Nullability.java:101) 位于org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313) 位于org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) 位于org.hibernate.event.def.AbstractSaveEventListener.SaveWithGenerateId(AbstractSaveEventListener.java:144) 在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 位于org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) 位于org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 位于org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) 位于org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 位于org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705) 位于org.hibernate.impl.SessionImpl.save(SessionImpl.java:693) 位于org.hibernate.impl.SessionImpl.save(SessionImpl.java:689) 位于app.persistencia.LibrosDAO.altaLibro(LibrosDAO.java:41) 位于app.negocio.GestionLibreria.altaLibro(GestionLibreria.java:26) 位于app.cliente.Main.Main(Main.java:98) 线程“main”org.hibernate.SessionException中出现异常:会话已关闭 位于org.hibernate.impl.SessionImpl.close(SessionImpl.java:312) 位于app.persistencia.LibrosDAO.altaLibro(LibrosDAO.java:49) 位于app.negocio.GestionLibreria.altaLibro(GestionLibreria.java:26) 位于app.cliente.Main.Main(Main.java:99)

正如我在其他问题中读到的,我认为编辑外键有问题,但我真的无法找到并解决错误。 代码如下:

编辑制图

<?xml version="1.0"?>
GESTIONLIBRERIA类

public class GestionLibreria implements ItfzGestionLibreria {

LibrosDAO dao = new LibrosDAO();

public boolean altaLibro(Libro libro) {

    int ID = libro.getID();
    String titulo = libro.getTitulo();
    Set<Autor> autores = libro.getAutores();
    Editorial editorial = libro.getEditorial();
    String isbn = libro.getIsbn();
    int publicacion = libro.getPublicacion();
    double precio = libro.getPrecio();
    String descripcion = libro.getDescripcion();
    dao.altaLibro(new Libro(ID, titulo, autores, editorial, isbn, publicacion, precio, descripcion));

    return false;
}
LIBRO类:

public class Libro implements Serializable {


/* 
 *          Declaracion de variables 
 */


private int ID, publicacion;
private String titulo, isbn, descripcion;
private Editorial editorial;
private Set<Autor> autores = new HashSet<Autor>();
private double precio;


/*
 *          Contructores
 *
 */

public Libro( int ID, String titulo, Set<Autor> autores, Editorial editorial, String isbn,
        int publicacion, double precio, String descripcion ) {

    this.ID = ID;   
    this.titulo = titulo;
    this.autores = autores;
    this.editorial = editorial;
    this.isbn = isbn;
    this.publicacion = publicacion;
    this.precio = precio;
    this.descripcion = descripcion;

}

public Libro(int ID, String titulo, Editorial editorial, String isbn, int publicacion, double precio, String descripcion ) {

    this.ID = ID;
    this.titulo = titulo;
    this.editorial = editorial;
    this.isbn = isbn;
    this.publicacion = publicacion;
    this.precio = precio;
    this.descripcion = descripcion;

}

public Libro()
{

}


/*
 *          Get&Set
 * 
 */



public int getID() {
    return ID;
}


public void setID(int iD) {
    ID = iD;
}


public int getPublicacion() {
    return publicacion;
}


public void setPublicacion(int publicacion) {
    this.publicacion = publicacion;
}


public String getTitulo() {
    return titulo;
}


public void setTitulo(String titulo) {
    this.titulo = titulo;
}


public Set<Autor> getAutores() {
    return autores;
}


public void setAutores(Set<Autor> autores) {
    this.autores = autores;
}   


public Editorial getEditorial() {
    return editorial;
}


public void setEditorial(Editorial editorial) {
    this.editorial = editorial;
}


public String getIsbn() {
    return isbn;
}


public void setIsbn(String isbn) {
    this.isbn = isbn;
}


public String getDescripcion() {
    return descripcion;
}


public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}


public double getPrecio() {
    return precio;
}


public void setPrecio(double precio) {
    this.precio = precio;
}


/*
 * Metodo toString()
 */

public String toString() {
    return "Libro [ID = " + ID + ", Publicacion = " + publicacion + ", Titulo = " + titulo + ", Autores = " + autores
            + ", Editorial = " + editorial + ", Isbn = " + isbn + ", Descripcion = " + descripcion + ", Precio = " + precio
            + "]";
}

/*
 * hashCode()
 */


public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ID;
    return result;
}


/*
 * equals()
 */


public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Libro other = (Libro) obj;
    if (ID != other.ID)
        return false;
    return true;
}


/*
 * Metodos de sincronizaccion
 * 
 */

public void addAutor(Autor a){
    autores.add(a);
}
公共类Libro实现可序列化{
/* 
*变量声明
*/
私有内部ID、公共ID;
私有字符串titulo、isbn、description;
私人编辑;
private Set autores=new HashSet();
私人双重财产;
/*
*建筑
*
*/
公共Libro(int-ID,String-titulo,Set-autores,编辑,String-isbn,
int publicacion,双精度,字符串描述){
this.ID=ID;
this.titulo=titulo;
this.autores=autores;
这是一篇社论;
这是isbn=isbn;
this.publicacion=publicacion;
this.precio=precio;
this.descripion=descripion;
}
公共Libro(int-ID,String-titulo,编辑性编辑,String-isbn,int-publicacion,双精度,字符串描述){
this.ID=ID;
this.titulo=titulo;
这是一篇社论;
这是isbn=isbn;
this.publicacion=publicacion;
this.precio=precio;
this.descripion=descripion;
}
公共图书馆()
{
}
/*
*获取并设置
* 
*/
公共int getID(){
返回ID;
}
公共无效集合iD(内部iD){
ID=ID;
}
public int getPublicacion(){
返回公告;
}
public void setPublicacion(int publicacion){
this.publicacion=publicacion;
}
公共字符串getitulo(){
返回titulo;
}
公共无效setTitulo(字符串titulo){
this.titulo=titulo;
}
公共集getAutores(){
自动返回;
}
公共作废自动设置(自动设置){
this.autores=autores;
}   
公共社论{
返回编辑;
}
公共编辑(社论){
这是一篇社论;
}
公共字符串getIsbn(){
返回isbn;
}
公共无效集合isbn(字符串isbn){
这是isbn=isbn;
}
公共字符串getDescription(){
返回描述;
}
公共void setDescription(字符串Description){
this.descripion=descripion;
}
公共双getPrecio(){
回报率;
}
公共空间设置精度(双精度){
this.precio=precio;
}
/*
*Metodo toString()
*/
公共字符串toString(){
返回“Libro[ID=“+ID+”,Publicacion=“+Publicacion+”,Titulo=“+Titulo+”,Autores=“+Autores
+“,Editorial=“+Editorial+”,Isbn=“+Isbn+”,description=“+description+”,Precio=“+Precio
+ "]";
}
/*
*hashCode()
*/
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果+ID;
返回结果;
}
/*
*等于()
*/
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
Libro其他=(Libro)obj;
if(ID!=其他.ID)
返回false;
返回true;
}
/*
*梅托多斯德辛克罗尼西翁酒店
* 
*/
公共无效自动添加(自动a){
自动添加(a);
}
}

班级社论:

public class Editorial {

private int ID_editorial;
private String nombre;
private Direccion direccion;
private String nif;
private Set<Libro> libros;


/*
 *  Constructores
 */

public Editorial(int ID_editorial, String nombre, Direccion direccion, String nif, Set<Libro> libros) {

    this.ID_editorial = ID_editorial;
    this.nombre = nombre;
    this.direccion = direccion;
    this.nif = nif;
    this.libros = libros;

}

public Editorial(int ID_editorial, String nombre, Direccion direccion, String nif) {

    this.ID_editorial = ID_editorial;
    this.nombre = nombre;
    this.direccion = direccion;
    this.nif = nif;

}

public Editorial(){

}


/*
 *  Get & Set
 */

public int getID_editorial() {
    return ID_editorial;
}

public void setID_editorial(int ID_editorial)
{
    this.ID_editorial = ID_editorial;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public Direccion getDireccion() {
    return direccion;
}

public void setDireccion(Direccion direccion) {
    this.direccion = direccion;
}

public String getNif() {
    return nif;
}

public void setNif(String nif) {
    this.nif = nif;
}

public Set<Libro> getLibros() {
    return libros;
}

public void setLibros(Set<Libro> libros) {
    this.libros = libros;
}


/*
 *  Metodo toString()
 */



public String toString() {
    return "Editorial [Id Editorial=" + ID_editorial + ", nombre=" + nombre + ", direccion=" + direccion + ", nif=" + nif + ", libros=" + libros + "]";
}
公共类编辑{
私人国际编辑部;
私有字符串名称;
私人董事;
私有字符串nif;
私有集libros;
/*
*建设者
*/
公共社论(int-ID_-edition、字符串名称、Direccion-Direccion、字符串nif、Set-libros){
this.ID_editive=ID_editive;
this.nombre=nombre;
this.direccion=direccion;
this.nif=nif;
this.libros=libros;
}
公共社论(int ID_社论、字符串名称、目录目录、字符串nif){
this.ID_editive=ID_editive;
this.nombre=nombre;
this.direccion=direccio
public class GestionLibreria implements ItfzGestionLibreria {

LibrosDAO dao = new LibrosDAO();

public boolean altaLibro(Libro libro) {

    int ID = libro.getID();
    String titulo = libro.getTitulo();
    Set<Autor> autores = libro.getAutores();
    Editorial editorial = libro.getEditorial();
    String isbn = libro.getIsbn();
    int publicacion = libro.getPublicacion();
    double precio = libro.getPrecio();
    String descripcion = libro.getDescripcion();
    dao.altaLibro(new Libro(ID, titulo, autores, editorial, isbn, publicacion, precio, descripcion));

    return false;
}
case 1:


        // Crear Editoriales

        Editorial e1 = new Editorial(1,"Editorial UNO", d1, "A111111");
        Editorial e2 = new Editorial(2,"Editorial DOS", d2, "B222222");
        Editorial e3 = new Editorial(3,"Editorial TRES", d3, "C333333");



        // Crear Libros

        Libro l1 = new Libro(1, "Libro 1", e1, "1111A", 2001, 11.11, "Este es el libro numero 1");
        Libro l2 = new Libro(2, "Libro 2", e1, "2222B", 2002, 22.22, "Este es el libro numero 2");
        Libro l3 = new Libro(3, "Libro 3", e1, "3333C", 2003, 33.33, "Este es el libro numero 3");
        Libro l4 = new Libro(4, "Libro 4", e2, "4444D", 2004, 44.44, "Este es el libro numero 4");
        Libro l5 = new Libro(5, "Libro 5", e2, "5555D", 2005, 55.55, "Este es el libro numero 5");
        Libro l6 = new Libro(6, "Libro 6", e3, "6666E", 2006, 66.66, "Este es el libro numero 
public class Libro implements Serializable {


/* 
 *          Declaracion de variables 
 */


private int ID, publicacion;
private String titulo, isbn, descripcion;
private Editorial editorial;
private Set<Autor> autores = new HashSet<Autor>();
private double precio;


/*
 *          Contructores
 *
 */

public Libro( int ID, String titulo, Set<Autor> autores, Editorial editorial, String isbn,
        int publicacion, double precio, String descripcion ) {

    this.ID = ID;   
    this.titulo = titulo;
    this.autores = autores;
    this.editorial = editorial;
    this.isbn = isbn;
    this.publicacion = publicacion;
    this.precio = precio;
    this.descripcion = descripcion;

}

public Libro(int ID, String titulo, Editorial editorial, String isbn, int publicacion, double precio, String descripcion ) {

    this.ID = ID;
    this.titulo = titulo;
    this.editorial = editorial;
    this.isbn = isbn;
    this.publicacion = publicacion;
    this.precio = precio;
    this.descripcion = descripcion;

}

public Libro()
{

}


/*
 *          Get&Set
 * 
 */



public int getID() {
    return ID;
}


public void setID(int iD) {
    ID = iD;
}


public int getPublicacion() {
    return publicacion;
}


public void setPublicacion(int publicacion) {
    this.publicacion = publicacion;
}


public String getTitulo() {
    return titulo;
}


public void setTitulo(String titulo) {
    this.titulo = titulo;
}


public Set<Autor> getAutores() {
    return autores;
}


public void setAutores(Set<Autor> autores) {
    this.autores = autores;
}   


public Editorial getEditorial() {
    return editorial;
}


public void setEditorial(Editorial editorial) {
    this.editorial = editorial;
}


public String getIsbn() {
    return isbn;
}


public void setIsbn(String isbn) {
    this.isbn = isbn;
}


public String getDescripcion() {
    return descripcion;
}


public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}


public double getPrecio() {
    return precio;
}


public void setPrecio(double precio) {
    this.precio = precio;
}


/*
 * Metodo toString()
 */

public String toString() {
    return "Libro [ID = " + ID + ", Publicacion = " + publicacion + ", Titulo = " + titulo + ", Autores = " + autores
            + ", Editorial = " + editorial + ", Isbn = " + isbn + ", Descripcion = " + descripcion + ", Precio = " + precio
            + "]";
}

/*
 * hashCode()
 */


public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ID;
    return result;
}


/*
 * equals()
 */


public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Libro other = (Libro) obj;
    if (ID != other.ID)
        return false;
    return true;
}


/*
 * Metodos de sincronizaccion
 * 
 */

public void addAutor(Autor a){
    autores.add(a);
}
public class Editorial {

private int ID_editorial;
private String nombre;
private Direccion direccion;
private String nif;
private Set<Libro> libros;


/*
 *  Constructores
 */

public Editorial(int ID_editorial, String nombre, Direccion direccion, String nif, Set<Libro> libros) {

    this.ID_editorial = ID_editorial;
    this.nombre = nombre;
    this.direccion = direccion;
    this.nif = nif;
    this.libros = libros;

}

public Editorial(int ID_editorial, String nombre, Direccion direccion, String nif) {

    this.ID_editorial = ID_editorial;
    this.nombre = nombre;
    this.direccion = direccion;
    this.nif = nif;

}

public Editorial(){

}


/*
 *  Get & Set
 */

public int getID_editorial() {
    return ID_editorial;
}

public void setID_editorial(int ID_editorial)
{
    this.ID_editorial = ID_editorial;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public Direccion getDireccion() {
    return direccion;
}

public void setDireccion(Direccion direccion) {
    this.direccion = direccion;
}

public String getNif() {
    return nif;
}

public void setNif(String nif) {
    this.nif = nif;
}

public Set<Libro> getLibros() {
    return libros;
}

public void setLibros(Set<Libro> libros) {
    this.libros = libros;
}


/*
 *  Metodo toString()
 */



public String toString() {
    return "Editorial [Id Editorial=" + ID_editorial + ", nombre=" + nombre + ", direccion=" + direccion + ", nif=" + nif + ", libros=" + libros + "]";
}
public class LibrosDAO implements ItfzLibrosDao {

SessionFactory sf = new Configuration().configure("hibernate2.cfg.xml").buildSessionFactory();

Session session;

Transaction tx;

/*
 * Crea un nuevo registro en la tabla con los datos del libro recibido como
 * argumento
 */

public boolean altaLibro(Libro libro) {
    // Creo una variable de tipo boolean que me retorna si se ha podido o no
    // insertar un nuevo libro
    session = sf.openSession();
    boolean insertado = false;

    Libro l = new Libro(libro.getID(),libro.getTitulo(),libro.getAutores(),libro.getEditorial(),libro.getIsbn(),
            libro.getPublicacion(),libro.getPrecio(),libro.getDescripcion());

    try {
        tx = session.beginTransaction();

        session.save(l);
        tx.commit();
        insertado= true;    
        } catch(Exception ex) {
            tx.rollback();
            ex.printStackTrace();
            insertado = false;
        } finally {
            session.close();

        }

        return insertado;
}