在工作中,我使用Eclipse, Jboss和Hibernate JPA。对于较小的私有项目,我喜欢使用Netbeans, GlassFish和Hibernate JPA。
问题:我想让hibernate自动生成表-但它不会为我做。
我做了什么:
- 首先,我安装了Netbeans, Glassfish和一个本地MySQL-DB。
我为Glassfish创建了一个JDBC-Connection:
url:
jdbc:mysql://localhost:3306/myDatabase?zeroDateTimeBehavior=convertToNull
name:
myDatabaseJDBC
Driver:
com.mysql.jdbc.Driver
连接似乎正常,"测试"它解析为一个成功的连接。
-
现在我像这样创建persistence .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>
-
然后我添加了所需的依赖到我的项目(使用maven)和hibernate插件到Glassfish
工作原理:当我创建一个表时,在Netbeans中我可以选择New -> Other -> Persistance -> Entity Class from Database
。连接显示了表,我选择一个,点击ok,然后我得到了实体。
我是否错过了任何配置步骤?
更新 : -------------
我想测试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)
在这里:hibernate, mysql, glassfish v3和JTA数据源,我找到了解决方案,添加
// For GlassFish:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.SunONETransactionManagerLookup
到persistence .xml。现在异常消失了,但我收到了另一个异常:Unknown Entity: CEntity
。
我发现,hibernate不能找到我的实体。(是的,我使用了javax.persistance.Entity
,而不是hibernate命名空间中的那个)。然而,手动"添加"实体到persistance.xml
解决了这个问题,并且还调用了自动创建表。
然而,现在我正在寻找正确的配置,所以添加每个实体到persistence .xml是不需要的。
我设置了<exclude-unlisted-classes>false</exclude-unlisted-classes>
,但是hibernate似乎忽略了…
关键是要加上:
<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>