WildFly + 休眠
Posted
技术标签:
【中文标题】WildFly + 休眠【英文标题】:WildFly + Hibernate 【发布时间】:2017-05-18 22:06:50 【问题描述】:我一直在努力配置 Hibernate 并在 WildFly 上运行它。
这是我的代码:
META-INF/persistence.xml
<persistence version="1.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_1_0.xsd">
<persistence-unit name="blog" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/blog?createDatabaseIfNotExist=true"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="abc"/>
<property name="hibernate.connection.password" value="abc"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/>
<property name="jboss.as.jpa.providerModule" value="org.hibernate:5.0"/>
</properties>
</persistence-unit>
pom.xml
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.2.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
用户:
@Entity
@Table(name = "users")
public class User
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@OneToMany(mappedBy = "user")
private Set<Post> posts;
当我加载我的主页时,没有创建数据库。
此外,我想保留一个用户。
@Stateless
public class UserRepositoryImpl implements UserRepository
@PersistenceContext(unitName = "blog")
private EntityManager entityManager;
public void create(User user)
this.entityManager.persist(user);
没有创建数据库并且实体管理器为空。我需要配置什么才能使其运行? 我正在使用 IntelliJ 进行测试。
【问题讨论】:
首先,当使用JTA
作为事务类型时,数据库连接细节不应该在persistence.xml
文件中。它们应该在您的 WilfFly 的standalone.xml
中。然后persistence.xml
只是引用它。
我猜其他的东西从根本上被破坏了。我找不到一个很好的教程如何做到这一点。我暂时离开它。谢谢
问题可能出在您使用 UserRepositoryImpl 的方式上。如:您未在此处提供的代码。显然 JEE 容器没有被触发以实际注入 entityManager 实例并因此启动持久性上下文,我只能假设这意味着 USerRepositoryImpl 没有被初始化为正确的 EJB 实例。
【参考方案1】:
JTA 数据源由 jpa 容器(在 Wildfly 内部)管理。
您必须在standalone.xml 中定义url、用户名、密码。
搜索datasources子系统<subsystem xmlns="urn:jboss:domain:datasources:4.0">
,添加datasource定义,例如:
<datasource jta="true" jndi-name="java:/jdbc/myDS" pool-name="MyDS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:mysql://localhost:3306/blog</connection-url>
<driver>mysqldriver.jar</driver>
<security>
<user-name>username</user-name>
<password>password</password>
</security>
</datasource>
接下来您必须为您的数据库驱动程序创建一个模块。有关详细信息,请查看文档:https://docs.jboss.org/author/display/WFLY8/DataSource+configuration
那么你的 persistence.xml 将如下所示:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="blog">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/myDS</jta-data-source>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
在服务器和组件启动期间观察异常。
【讨论】:
【参考方案2】:这个话题有点老了,但是我可以看到没有关于如何在你的 persistence.xml 中使用 Hibernate Connection Properties 的直接答案,但是如果你使用 RESOURCE_LOCAL 数据源,这是可能的:
<persistence-unit name="umaPuLocal" transaction-type="RESOURCE_LOCAL">
要知道的是,RESOURCE_LOCAL 不能利用 JTA 功能,因此可能会导致数据不一致。
参考:Using Hibernate properties in persistence.xml
【讨论】:
【参考方案3】:在文件 persistence.xml 中必须包含要持久化的类
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>package.User<class>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/blog?createDatabaseIfNotExist=true"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="abc"/>
<property name="hibernate.connection.password" value="abc"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/>
<property name="jboss.as.jpa.providerModule" value="org.hibernate:5.0"/>
</properties>
您可以包含任意数量的类
【讨论】:
不,你不会,在像 Wildfly 这样的 JEE 容器中,实体会在应用程序部署时自动发现。以上是关于WildFly + 休眠的主要内容,如果未能解决你的问题,请参考以下文章
Java EE + Wildfly:无法启动服务 jboss.persistenceunit
JBoss as7 到 WildFly 的 Hibernate 迁移
从 Wildfly 11 升级到 Wildfly 15 时的日期序列化问题