当前位置: 首页 > 知识库问答 >
问题:

Hibernate属性引用null

龙高超
2023-03-14

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

Hibernate:选择编辑。ID_Editical,Editical_。NOMBRE as NOMBRE4_u,editorial_u。ID\u目录为ID3\u 4\u,editorial\u。NIF作为NIF4_来自Editory Editory_ where Editory_。ID\u编辑=?组织。冬眠PropertyValueException:not null属性引用空值或瞬时值:app。modelo。Libro。org的社论。冬眠发动机可空性。org上的checkNullability(Nullability.java:101)。冬眠事件def。AbstractSaveEventListener。performSaveOrReplicate(AbstractSaveEventListener.java:313)位于org。冬眠事件def。AbstractSaveEventListener。performSave(AbstractSaveEventListener.java:204)位于org。冬眠事件def。AbstractSaveEventListener。saveWithGeneratedId(AbstractSaveEventListener.java:144)位于org。冬眠事件def。DefaultSaveOrUpdateEventListener。saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)位于org。冬眠事件def。DefaultSaveEventListener。saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)位于org。冬眠事件def。DefaultSaveOrUpdateEventListener。组织上的entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)。冬眠事件def。DefaultSaveEventListener。performSaveOrUpdate(DefaultSaveEventListener.java:50)位于org。冬眠事件def。DefaultSaveOrUpdateEventListener。onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)位于org。冬眠impl。SessionImpl。fireSave(SessionImpl.java:705)位于org。冬眠impl。SessionImpl。保存(SessionImpl.java:693)到org。冬眠impl。SessionImpl。在应用程序中保存(SessionImpl.java:689)。持续性。利布罗斯岛。altaLibro(LibrosDAO.java:41)在app。negocio。GestionLibreria。altaLibro(GestionLibreria.java:26)在app。客户。主要的线程“main”组织中的main(main.java:98)异常。冬眠SessionException:会话已在组织中关闭。冬眠impl。SessionImpl。在应用程序上关闭(SessionImpl.java:312)。持续性。利布罗斯岛。altaLibro(LibrosDAO.java:49)在app。negocio。GestionLibreria。altaLibro(GestionLibreria.java:26)在app。客户。主要的main(main.java:99)

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

编辑制图

<?xml version="1.0"?>
<class name="app.modelo.Editorial" table="EDITORIAL">

    <!-- Clave Primaria -->

    <id name="ID_editorial" column="ID_EDITORIAL" type="int" >
        <generator class="assigned" />
    </id>


    <!-- Propriedades -->

    <property name="nombre" column="NOMBRE" type="string" lazy="false" not-null="false"/>

    <many-to-one unique="true" name="direccion" column="ID_DIRECCION" not-null="true" cascade="all"/> <!--  Simulamos un Many to One con la entidad Editorial para generar una Foreing Key -->

    <property name="nif" column="NIF" type="string" lazy="false" not-null="false"/>

    <set name="libros" cascade="all" >
        <key column="ID_EDITORIAL" />
        <one-to-many class="app.modelo.Editorial" />
    </set>


</class>

LIBRO映射

<hibernate-mapping>

<class name="app.modelo.Libro" table="LIBROS">

    <!-- Clave Primaria -->

    <id name="ID" column="ID_LIBRO" type="int" >
        <generator class="assigned" />
    </id>       

    <!-- Propriedades -->

    <property name="titulo" type="string" column="TITULO" lazy="false"/>

    <property name="isbn" type="string" column="ISBN" lazy="false"/>

    <property name="publicacion" type="int" column="PUBLICACION" lazy="false"/>

    <property name="precio" type="double" column="PRECIO" lazy="false"/>

    <property name="descripcion" type="string" column="DESCRIPCION" lazy="true" />

    <many-to-one name="editorial" column="ID_EDITORIAL" class="app.modelo.Editorial" not-null="true" />

    <set name="autores" inverse="true" table="AUTOR_LIBRO" cascade="all">   <!-- Gestionamos el Many to Many con AUTOR haciendo referencia a la tabla intermedia  -->
        <key column="ID_LIBRO" />   <!-- Nueva columna en la tabla intermedia  -->
        <many-to-many column="ID_AUTOR" class="app.modelo.Autor" />
    </set>

</class>

LIBROSDAO类

public class LibrosDAO implements ItfzLibrosDao {

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

Session session = sf.openSession();

Transaction tx = session.getTransaction();

/*
 * 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
    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.begin();

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

        }

        return insertado;
}

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;
}

主要:

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 

类别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);
}

}

课堂编辑:

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 + "]";
}

共有1个答案

司徒寒
2023-03-14

您的会话处理错误,请将您的Class LibrosDAO更改为:

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;
}
 类似资料:
  • 我第一次使用Hibernate,并且很难让它与我的模式一起工作。 我得到了"org.hibernate.注释异常:映射通过引用未知的目标实体属性:学生。教师在Faculty.all学生”。 一些学生共用一个导师。因此,我认为学生和教师的关系是多对多的,但我被告知这是多对多的关系。 Student.java Faculty.java 数据库架构: 在看了留档后,我尝试了几种不同的注释,但我看不出我做

  • 通常有两种方法来引用实体的 identifier 属性: 特殊属性(lowercase)id 可以用来引用实体的 identifier 属性 假设这个实体没有定义用 non-identifier 属性命名的 id。 如果这个实体定义了 identifier 属性,你可以使用属性名。 对组合 identifier 属性的引用遵循相同的命名规则。如果实体有一个 non-identifier 属性命名的

  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 我正在尝试将一个较旧的项目升级到spring/hibernate 5。我们使用库,用于在Oracle DB(19c)中存储形状数据。配置的hibernate方言是。 对于以前的Hibernate版本,这工作正常: 我用hibernate 5尝试了不同的类型,但我永远无法将实体刷新到数据库中。它在我们的抽象保存方法中崩溃: 堆栈跟踪: 为德国人道歉。最后一行意味着不一致的数据类型MDSYS。需要SD

  • 首先,我的课程: 使用者 角色地图。JAVA 当我尝试在服务器上运行这个我有这样的异常:错误创建bean与名称'SessionFactory'定义在ServletContext资源[/WEB-INF/类/base Beans.xml]:调用init方法失败;嵌套的异常org.hibernate.注释异常:映射通过引用一个未知的目标实体属性:com.patpuc.model.ap.users在com

  • 问题内容: 在HTML5中,属性引号是 可选 的。 引用它们的利弊是什么? 更新:根据答案增加了优点: 引用所有属性的优点: 所有编辑都可以正确处理 更一致 更好的可移植性(更容易更改文档类型) 易于维护(尤其是如果属性可能为空) 更容易“查找和替换”更改 更清洁的文档(如果您认为引号可以提高可读性) ? 省略 可选引号的优点: 文件大小略有减少 清洁文档(如果您希望使用最少的文字) ? 问题答案