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子系统&lt;subsystem xmlns="urn:jboss:domain:datasources:4.0"&gt;,添加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 时的日期序列化问题

使用 wildfly (wildfly:deploy) 在一个简单的 Maven 项目中构建失败

Docker 容器中的 Wildfly 未启动

具有 Wildfly 域的数据源