2017-03-09 50 views
0

编辑:我apoligies。我似乎看到一个错误。它是这样的:异常在线程“主”org.hibernate.MappingException:未知实体:com.hibernate.hibernate.Message我的休眠测试程序在执行期间死机

我做了一个简单的测试程序,测试hibernate的persist()方法和createQuery()方法。

它与只有一个名为Message的表的mySQL测试数据库进行通信。该表有2列,即id(主键)和文本。有关工作台中的设置,请参阅下面的图像。

workbench settings

这是休眠可执行的Java文件

package com.hibernate.hibernate; 
import java.util.List; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 

/** 
* 
* @author maurice 
*/ 
public class Hibernate { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 

Session session = sessionFactory.openSession(); 
session.beginTransaction(); 
Message message = new Message(); 
String hql = "FROM Message"; 
Query query = session.createQuery(hql); 
List results = query.list(); 
System.out.print(results); 
//message.setText("hoi"); 
//session.persist(message); 
session.close(); 
    } 

} 

这是配置并返回SessionFactory的

package com.hibernate.hibernate; 

import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 

public class HibernateUtil { 
    private static SessionFactory sessionFactory; 

    public static SessionFactory getSessionFactory() { 
     if (sessionFactory == null) { 
      // loads configuration and mappings 
      Configuration configuration = new Configuration().configure(); 
      ServiceRegistry serviceRegistry 
       = new StandardServiceRegistryBuilder() 
        .applySettings(configuration.getProperties()).build(); 

      // builds a session factory from the service registry 
      sessionFactory = configuration.buildSessionFactory(serviceRegistry);   
     } 

     return sessionFactory; 
    } 
} 

,这里的HibernateUtil类文件是注释的POJO也就是坚持使用休眠。

package com.hibernate.hibernate; 

import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 
import javax.xml.bind.annotation.XmlRootElement; 

/** 
* 
* @author maurice 
*/ 
@Entity 
@Table(name = "message") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Message.findAll", query = "SELECT m FROM Message m"), 
    @NamedQuery(name = "Message.findById", query = "SELECT m FROM Message m WHERE m.id = :id"), 
    @NamedQuery(name = "Message.findByText", query = "SELECT m FROM Message m WHERE m.text = :text")}) 
public class Message implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 

    private Integer id; 
    @Column(name = "text") 
    private String text; 

    public Message() { 
    } 

    public Message(Integer id) { 
     this.id = id; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Message)) { 
      return false; 
     } 
     Message other = (Message) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "com.hibernate.hibernate.Message[ id=" + id + " ]"; 
    } 

} 

最后,这里是hibernate.cfg.xml配置文件。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?zeroDateTimeBehavior=convertToNull</property> 
    <property name="hibernate.connection.username">scott</property> 
    <property name="hibernate.connection.password">tiger</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <mapping class = "com.hibernate.hibernate.Message"/> 
    </session-factory> 
</hibernate-configuration> 

继承人日志文件,当我运行项目。它没有任何错误,但只是冻结

cd C:\book\Hibernate; "JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_71" cmd /c "\"\"C:\\Program Files\\NetBeans 8.1\\java\\maven\\bin\\mvn.bat\" -Dexec.args=\"-classpath %classpath com.hibernate.hibernate.Hibernate\" -Dexec.executable=\"C:\\Program Files\\Java\\jdk1.8.0_71\\bin\\java.exe\" -Dexec.classpathScope=runtime -Dmaven.ext.class.path=\"C:\\Program Files\\NetBeans 8.1\\java\\maven-nblib\\netbeans-eventspy.jar\" -Dfile.encoding=UTF-8 org.codehaus.mojo:exec-maven-plugin:1.2.1:exec\"" 
Running NetBeans Compile On Save execution. Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their jar artifacts. 
Scanning for projects... 

------------------------------------------------------------------------ 
Building Hibernate 1.0-SNAPSHOT 
------------------------------------------------------------------------ 
Downloading: file:C:\book\Hibernate/lib/unknown/binary/hibernate-jpamodelgen-4.3.1.Final/SNAPSHOT/maven-metadata.xml 

Downloading: file:C:\book\Hibernate/lib/unknown/binary/hibernate-jpamodelgen-4.3.1.Final/SNAPSHOT/hibernate-jpamodelgen-4.3.1.Final-SNAPSHOT.pom 

The POM for unknown.binary:hibernate-jpamodelgen-4.3.1.Final:jar:SNAPSHOT is missing, no dependency information available 
Downloading: file:C:\book\Hibernate/lib/unknown/binary/mysql-connector-java-5.1.23-bin/SNAPSHOT/maven-metadata.xml 

Downloading: file:C:\book\Hibernate/lib/unknown/binary/mysql-connector-java-5.1.23-bin/SNAPSHOT/mysql-connector-java-5.1.23-bin-SNAPSHOT.pom 

The POM for unknown.binary:mysql-connector-java-5.1.23-bin:jar:SNAPSHOT is missing, no dependency information available 

--- exec-maven-plugin:1.2.1:exec (default-cli) @ Hibernate --- 
mrt 09, 2017 7:29:43 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> 
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final} 
mrt 09, 2017 7:29:43 PM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {4.3.1.Final} 
mrt 09, 2017 7:29:43 PM org.hibernate.cfg.Environment <clinit> 
INFO: HHH000206: hibernate.properties not found 
mrt 09, 2017 7:29:43 PM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
mrt 09, 2017 7:29:43 PM org.hibernate.cfg.Configuration configure 
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml 
mrt 09, 2017 7:29:43 PM org.hibernate.cfg.Configuration getConfigurationInputStream 
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml 
mrt 09, 2017 7:29:43 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity 
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide! 
mrt 09, 2017 7:29:44 PM org.hibernate.cfg.Configuration doConfigure 
INFO: HHH000041: Configured SessionFactory: null 
mrt 09, 2017 7:29:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!) 
mrt 09, 2017 7:29:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/hibernate?zeroDateTimeBehavior=convertToNull] 
mrt 09, 2017 7:29:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH000046: Connection properties: {user=scott, password=****} 
mrt 09, 2017 7:29:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH000006: Autocommit mode: false 
mrt 09, 2017 7:29:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 
mrt 09, 2017 7:29:46 PM org.hibernate.dialect.Dialect <init> 
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect 
mrt 09, 2017 7:29:46 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService 
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) 
mrt 09, 2017 7:29:46 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> 
INFO: HHH000397: Using ASTQueryTranslatorFactory 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute 
INFO: HHH000228: Running hbm2ddl schema update 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute 
INFO: HHH000102: Fetching database metadata 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute 
INFO: HHH000396: Updating schema 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> 
INFO: HHH000261: Table found: hibernate.message 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> 
INFO: HHH000037: Columns: [id, text] 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> 
INFO: HHH000108: Foreign keys: [] 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> 
INFO: HHH000126: Indexes: [primary] 
mrt 09, 2017 7:29:48 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute 
INFO: HHH000232: Schema update complete 
[] 

继承人一个视觉例子,我的意思是冻结,负载条只是卡住了。

enter image description here

有谁知道什么可能会造成这个?任何帮助将不胜感激谢谢。

+0

顺便说一句,该POJO中使用NetBeans自动创建的,我知道,坚持代码被注释掉了,只是假装它没有。 – Maurice

+0

你的程序工作正常:它打印一个空列表('[]')。如果您希望JVM退出,只需添加System.exit(0)即可。关闭SessionFactory也应该起作用,AFAIK。 –

回答

1

我注意到,你有没有在你的程序结束时关闭的SessionFactory

sessionFactory.close(); 

此外,这是极为重要的,始终结束当前运行的数据库事务。因此,如果一切正常,应该调用提交,并且在抛出任何异常的情况下在catch块中调用回滚

要解决你得到的错误:

Unknown entity: com.hibernate.hibernate.Message 

你需要让Hibernate知道该映射:

configuration.addAnnotatedClass(Message.class); 
+0

谢谢你,在添加了你建议的两行代码之后,我现在不再有任何错误了。但是,Hibernate仍然没有成功地将Message对象作为其内容持续保留。 Hibernate确实创建了一个名为Hibernate_sequence的表,所以它对数据库做了一些事情。然而,它并没有在“hoi”中添加一行。你能明白为什么吗? – Maurice

+0

另外,为什么我需要使用.addAnnotatedClass,当我已经在hibernate.cfg.xml文件中有?他们不是2种让休眠映射类的方法吗? – Maurice

+0

看来一个Transaction对象需要最终确定Hibernate想要对commit()方法进行的调用。所以我想明白了。 – Maurice