2013-05-17 83 views
0

在工作中,即时通讯使用Eclipse,Jboss和Hibernate JPA。对于一个较小的私人项目,我喜欢使用Netbeans,GlassFish和Hibernate JPA。NetBeans,GlassFish和Hibernate JPA

问题:我想让hibernate自动生成表 - 但它不会那样做。

我做了什么:

  • 首先,我安装了 - 明显是显而易见的 - Netbeans的,Glassfish和本地的MySQL数据库。
  • 我创建了Glassfish的一个JDBC的连接:

    网址:jdbc:mysql://localhost:3306/myDatabase?zeroDateTimeBehavior=convertToNull

    名称:myDatabaseJDBC

    司机:com.mysql.jdbc.Driver

连接似乎罚款, “测试” 吧解决了成功的连接。

  • 现在我创造了这样的persistance.xml:

    <?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="2.0" 
        xmlns="http://java.sun.com/xml/ns/persistence" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
         http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="primary" transaction-type="JTA"> 
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <jta-data-source>myDatabaseJDBC</jta-data-source> 
        <exclude-unlisted-classes>false</exclude-unlisted-classes> 
        <properties> 
         <property name="hibernate.hbm2ddl.auto" value="create"/> 
         <property name="hibernate.show_sql" value="true"/> 
        </properties> 
    </persistence-unit> 
    

  • 然后,我添加所需depoendencies到我的项目(使用maven)和Hibernate插件到GlassFish

什么作品:当我创建了一个表,在Netbeans中,我可以选择New -> Other -> Persistance -> Entity Class from Database。连接显示表,我选择一个,点击好,我得到了实体。

但是,我通常工作相反的方式并让hibernate从创建的实体中生成我的表......那些谁不会工作。 (甚至在构建项目时,Hibernate甚至没有被调用)

我是否错过任何配置步骤?

更新:-------------

我想测试,如果Hibernate是 “积极的” 以任何方式。所以我创建了一个简单的实体,一个控制器,并用一个按钮部署了应用程序。

public void doSth() { 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("primary"); 
    EntityManager em = emf.createEntityManager(); 

    CEntity c = new CEntity(); 
    c.setName("Test"); 

    em.persist(c); 
} 

首先,我接收到一个异常:

Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager 
     at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:376) 

Overhere:hibernate, mysql, glassfish v3, and JTA datasource我找到了解决

// For GlassFish: 
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.SunONETransactionManagerLookup 

添加到persistance.xml。现在例外情况已经消失,但我收到另一个:Unknown Entity: CEntity

我想通了,hibernate无法找到我的实体。 (是的,我使用javax.persistance.Entity而不是hibernate命名空间中的那个)。但是,手动将实体“添加”到persistance.xml可以解决问题,并且还会调用自动创建表。

但是,现在我正在寻找正确的配置,因此不需要为persistance.xml添加每个实体。

我设置<exclude-unlisted-classes>false</exclude-unlisted-classes>但休眠似乎忽视...

+0

你在哪里设置连接参数为mysql? – Stephan

+0

JDBC连接中的@Stephan。 (包括用户名,密码,端口号) – dognose

+0

试试这个:,你也可以检查mysql进程列表来查看是否存在连接 – Stephan

回答

1

的关键是补充:

<property name="hibernate.archive.autodetection" value="class"/> 

到persistence.xml中的属性集合。毕竟:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="primary"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>myDatabaseJDBC</jta-data-source> 

     <properties> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/> 
      <property name="hibernate.archive.autodetection" value="class"/> 
     </properties> 
    </persistence-unit> 
</persistence>