Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 Hibernate映射异常[尝试了以前的解决方案]_Java_Hibernate_Maven - Fatal编程技术网

Java Hibernate映射异常[尝试了以前的解决方案]

Java Hibernate映射异常[尝试了以前的解决方案],java,hibernate,maven,Java,Hibernate,Maven,我正在尝试运行一个基于maven的Hibernate Hello World项目。我每一步都做得很好,但这给了Hibernate映射一个例外:未知实体。我已经在Hibernate.cfg.xml中声明了实体类的映射 这是我的配置文件代码 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD/

我正在尝试运行一个基于maven的Hibernate Hello World项目。我每一步都做得很好,但这给了Hibernate映射一个例外:未知实体。我已经在Hibernate.cfg.xml中声明了实体类的映射

这是我的配置文件代码

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>


    <!-- Database connection settings -->

    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test
    </property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup
         if table isn't present hibernate will create the table -->
    <property name="hbm2ddl.auto">create</property>

    <property name="hibernate.current_session_context_class">thread</property>
    <mapping class="com.openlibrary.model.Book"/>


</session-factory>
</hibernate-configuration>
还有我的模范班 包com.openlibrary.model

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Book {
    @Id
    @GeneratedValue
    int bookID;
    String bookName;

    public int getBookID() {
        return bookID;
    }

    public void setBookID(int bookID) {
        this.bookID = bookID;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
}
这是个例外

Exception in thread "main" org.hibernate.UnknownEntityTypeException: Unable to locate persister: com.openlibrary.model.Book
at org.hibernate.internal.SessionFactoryImpl.locateEntityPersister(SessionFactoryImpl.java:787)
at org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2637)
at org.hibernate.internal.SessionImpl.access$2500(SessionImpl.java:164)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2575)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2562)
at org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1044)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:955)
at com.openlibrary.dao.BookDAO.getBookById(BookDAO.java:43)
at com.openlibrary.test.Testing.main(Testing.java:22)
线程“main”org.hibernate.UnknownEntityTypeException中的异常:找不到persister:com.openlibrary.model.Book 位于org.hibernate.internal.SessionFactoryImpl.locateEntityypersister(SessionFactoryImpl.java:787) 位于org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2637) 访问org.hibernate.internal.SessionImpl.access$2500(SessionImpl.java:164) 位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl。(SessionImpl.java:2575) 位于org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl。(SessionImpl.java:2562) 位于org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1044) 位于org.hibernate.internal.SessionImpl.get(SessionImpl.java:955) 位于com.openlibrary.dao.BookDAO.getBookById(BookDAO.java:43) 位于com.openlibrary.test.Testing.main(Testing.java:22) 我知道以前有人问过这样的问题,但我无法理解为什么hibernate在映射已经完成时抛出异常。我上次是差不多一年前做的。它的工作原理是一样的。这里需要帮助

现在,这个场景有一个小小的转折。我通过更改hibernate core的maven依赖项绕过了异常。我得到了这个依赖性的例外。这是maven网站上的最新消息

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.0.CR2</version>
 </dependency>

org.hibernate
冬眠核心
5.0.0.CR2

我将版本更改为4.3.7.Final。当时也不例外。我不知道为什么它会抛出异常。也许有人能解释。我将非常感谢。

您的书无法实现序列化。 试试这个

public class Book implements Serializable{
}

我相信,在hibernate的最新版本中,他们已经删除了对配置文件中
标记的支持。相反,您可以使用配置类中定义的
addAnnotatedClass()
方法。i、 例如,configuration.addAnnotatedClass(Book.class);在这种情况下


-Madhu.

首先在实体类中实现可序列化接口

public class Book implements Serializable{
}
其次,不要将配置与StandardServiceRegistryBuilder一起使用,配置被视为不推荐使用, 而是按照hibernate 5文档中提到的那样进行引导,以供参考,转到下面的链接

或者你可以修改你的代码如下给一个尝试,我希望它会工作

if (sessionFactory == null) {

        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        configuration.addClass( Book.class ).addResource( "com/openlibrary/model/Book.hbm.xml" );
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(serviceRegistry.build());

    }

不要在StandardServiceRegistryBuilder中使用配置,配置被视为不推荐使用,而是按照hibernate 5文档中提到的方法进行引导,我遇到了同样的问题,这就解决了它

StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure( "org/hibernate/example/MyCfg.xml" )
.build();

Metadata metadata = new MetadataSources( standardRegistry )
.addAnnotatedClass( MyEntity.class )
.addAnnotatedClassName( "org.hibernate.example.Customer" )
.addResource( "org/hibernate/example/Order.hbm.xml" )
.addResource( "org/hibernate/example/Product.orm.xml" )
.getMetadataBuilder()
.applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE )
.build();

SessionFactory sessionFactory = metadata.getSessionFactoryBuilder()
.applyBeanManager( getBeanManagerFromSomewhere() )
.build();

有关更多详细信息,请检查

-您的图书模型类未实现可序列化接口

-试试下面的代码

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

    @Entity
    public class Book implements Serializable {
        @Id
        @GeneratedValue
        int bookID;
        String bookName;

        public int getBookID() {
            return bookID;
        }

        public void setBookID(int bookID) {
            this.bookID = bookID;
        }

        public String getBookName() {
            return bookName;
        }

        public void setBookName(String bookName) {
            this.bookName = bookName;
        }
    }

显然,您应该添加,但没有影响:

  public class Book implements Serializable{
   }          
但当我将版本更改为4.3.7.Final时。当时也不例外

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

org.hibernate
冬眠核心
4.3.7.最终版本

文件是否应命名为hibernate.cfg.xml(区分大小写,h而不是h)?你确定你真的使用了你的配置文件吗(您的类路径中可能有另一个配置文件?或者您是否已将实体类打包到应用程序中?是否可以发布您遇到的异常?@diufanman抱歉,我刚才键入的问题有误。它实际上是hibernate.cfg.xml,在我的项目中也是如此。是的,我确信W配置文件,我有我的pac正确地标记了实体类。@Rdx我正在添加有问题的异常。现在场景中有一点扭曲。我通过更改hibernate core的maven依赖项绕过了异常。我得到了具有此依赖项的异常。hibernate core和版本5.0.0.CR2。这是maven网站上的最新版本。[在最后的问题中添加了确切的代码]但是当我将版本更改为4.3.7.Final时,没有异常。我不知道它为什么会引发异常。也许你可以解释一下。我会很感激的。:)
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.3.7.Final</version>
   </dependency>