在工作中,我使用Eclipse,Jboss和Hibernate JPA。对于较小的私有项目,我喜欢使用Netbeans,GlassFish和Hibernate JPA。
问题:我希望hibernate自动生成表格 - 但它不会对我这样做。
我做了什么:
我为Glassfish创建了一个JDBC-Connection:
url: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添加到我的Project(使用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
。
javax.persistance.Entity
而不是hibernate名称空间中的那个)。但是,手动将实体“添加”到persistance.xml
可以解决问题,并且还会调用自动表创建。
但是,现在我正在寻找正确的配置,因此不需要将每个实体添加到persistance.xml。
我设置<exclude-unlisted-classes>false</exclude-unlisted-classes>
但是hibernate似乎忽略了......
答案 0 :(得分:1)
关键是要添加:
<property name="hibernate.archive.autodetection" value="class"/>
到persistence.xml的properties-collection。毕竟:
<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>