Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠将null分配给select的最后一条记录?_Java_Hibernate - Fatal编程技术网

Java 休眠将null分配给select的最后一条记录?

Java 休眠将null分配给select的最后一条记录?,java,hibernate,Java,Hibernate,我想创建两个带有Hibernate注释的类——Book和Bookshelf。书有一个参考它的书架,书架上有一个它所包含的书的列表。问题是,当我试图用一个新书架保存一本新书时,当我试图访问书架上的书时,我会得到一个NullPointerException 有趣的是,当我重新运行testcase时,上次抛出异常的记录会被读取,但新添加的记录会使应用程序崩溃。原因可能是什么?代码如下: src/main/java/com/mkyong/App.java: package com.mkyong;

我想创建两个带有Hibernate注释的类——Book和Bookshelf。书有一个参考它的书架,书架上有一个它所包含的书的列表。问题是,当我试图用一个新书架保存一本新书时,当我试图访问书架上的书时,我会得到一个NullPointerException

有趣的是,当我重新运行testcase时,上次抛出异常的记录会被读取,但新添加的记录会使应用程序崩溃。原因可能是什么?代码如下:

src/main/java/com/mkyong/App.java:

 package com.mkyong;

 import java.util.List;

 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.cfg.Configuration;

 import com.mkyong.pojo.Book;
 import com.mkyong.pojo.Bookshelf;
 import com.mkyong.util.HibernateUtil;


 public class App {
    public static void main(String[] args) {
            System.out.println("Hibernate one to one (Annotation)");
            new Configuration().configure().buildSessionFactory();

            Session session = HibernateUtil.getSessionFactory().openSession();
            testWriting(session);

            //https://www.youtube.com/watch?v=hAAlDoAtV7Y
            testReading(session);

            System.out.println("Done");
    }

    private static void testWriting(Session session) {
            session.beginTransaction();

            Bookshelf b2 = new Bookshelf();
            session.save(b2);

            Book b = new Book(b2);

            session.save(b);
            session.getTransaction().commit();
    }

    private static void testReading(Session session) {
            Query q = session.createQuery("from Bookshelf");
            List<Bookshelf> bookshelves = q.list();
            System.out.println("The list size is:" + bookshelves.size());
            for (Bookshelf b3 : bookshelves) {
                    System.out.println("b3.id=" + b3.getId());
                    List<Book> books = b3.getBooks();
                    for (Book book : books) {
                            System.out.println(book.getId());
                    }
            }
    }
 }
src/main/java/com/mkyong/util/HibernateUtil.java:

 package com.mkyong.util;

 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.Configuration;

 public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
            try {
                    // Create the SessionFactory from hibernate.cfg.xml
                    return new Configuration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                    // Make sure you log the exception, as it might be swallowed
                    System.err.println("Initial SessionFactory creation failed." + ex);
                    throw new ExceptionInInitializerError(ex);
            }
    }

    public static SessionFactory getSessionFactory() {
            return sessionFactory;
    }

    public static void shutdown() {
            // Close caches and connection pools
            getSessionFactory().close();
    }

 }
src/main/resources/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.url">jdbc:mysql://localhost:3306/library</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password"></property>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
         <property name="hibernate.hbm2ddl.auto">update</property>

            <property name="show_sql">true</property>
            <mapping class="com.mkyong.pojo.Book" />
            <mapping class="com.mkyong.pojo.Bookshelf" />

    </session-factory>

 </hibernate-configuration>

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/library
根
org.hibernate.dialogue.mysqldialogue
更新
真的
pom.xml:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.common</groupId>
    <artifactId>HibernateExample</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>HibernateExample</name>
    <url>http://maven.apache.org</url>

    <repositories>
            <repository>
                    <id>JBoss repository</id>
                    <url>http://repository.jboss.org/nexus/content/groups/public/</url>
            </repository>
    </repositories>

    <dependencies>

            <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.8.2</version>
                    <scope>test</scope>
            </dependency>

            <!-- MySQL database driver -->
            <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.15</version>
            </dependency>

    <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>4.1.4.Final</version>
            </dependency>

            <dependency>
                    <groupId>javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>3.12.1.GA</version>
            </dependency>

            <!-- logback logging framework-->
            <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                    <version>0.9.28</version>
            </dependency>

            <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                    <version>0.9.28</version>
            </dependency>

                            <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>1.3.161</version>
            </dependency>

    </dependencies>
 </project>

4.0.0
com.mkyong.common
冬眠的例子
罐子
1
冬眠的例子
http://maven.apache.org
JBoss存储库
http://repository.jboss.org/nexus/content/groups/public/
朱尼特
朱尼特
4.8.2
测试
mysql
mysql连接器java
5.1.15
org.hibernate
冬眠核心
4.1.4.最终版本
javassist
javassist
3.12.1.GA
回写
回溯堆芯
0.9.28
回写
回归经典
0.9.28
com.h2数据库
氢
1.3.161

您会得到一个空指针异常,因为Bookshelf类中的书籍列表从未初始化,也从未向其中添加任何书籍。使对象的图形保持一致是您的责任。书架上永远不应该有空的书籍列表。它可能有一个空列表。当你为一个给定的书架创建一本新书时,你也应该把书添加到书架上

将代码更改为:

public class Bookshelf implements java.io.Serializable {
    private List<Book> books = new ArrayList<Book>(0);
    ...

    public void addBook(Book book) {
        books.add(book);
        book.setBookshelf(this);
    }
}

在不知道异常从何处抛出的情况下,要筛选的代码太多了。
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.common</groupId>
    <artifactId>HibernateExample</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>HibernateExample</name>
    <url>http://maven.apache.org</url>

    <repositories>
            <repository>
                    <id>JBoss repository</id>
                    <url>http://repository.jboss.org/nexus/content/groups/public/</url>
            </repository>
    </repositories>

    <dependencies>

            <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.8.2</version>
                    <scope>test</scope>
            </dependency>

            <!-- MySQL database driver -->
            <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.15</version>
            </dependency>

    <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>4.1.4.Final</version>
            </dependency>

            <dependency>
                    <groupId>javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>3.12.1.GA</version>
            </dependency>

            <!-- logback logging framework-->
            <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                    <version>0.9.28</version>
            </dependency>

            <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                    <version>0.9.28</version>
            </dependency>

                            <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>1.3.161</version>
            </dependency>

    </dependencies>
 </project>
public class Bookshelf implements java.io.Serializable {
    private List<Book> books = new ArrayList<Book>(0);
    ...

    public void addBook(Book book) {
        books.add(book);
        book.setBookshelf(this);
    }
}
    private static void testWriting(Session session) {
        session.beginTransaction();

        Bookshelf b2 = new Bookshelf();
        session.save(b2);

        Book b = new Book();
        b2.addBook(b);

        session.save(b);
        session.getTransaction().commit();
    }
}