【问题标题】:Hibernate not persisting entity to MySql - Wildfly 10Hibernate 没有将实体持久化到 MySql - Wildfly 10
【发布时间】:2017-10-02 08:55:15
【问题描述】:

我正在使用 MySQL 数据库将我的实体保存在这个项目中。我没有从休眠中收到任何错误消息,但是当我签入数据库时​​,它是空的,并且没有创建任何表。

persistence.xml(编辑:添加数据源并将事务类型更改为 JTA

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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">
<persistence-unit name="punit" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/MySqlDS</jta-data-source>
    <properties>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
    </properties>
</persistence-unit>

在服务器启动时:

23:42:35,136 INFO  [stdout] (ServerService Thread Pool -- 59) Hibernate: drop table if exists book
23:42:35,136 INFO  [stdout] (ServerService Thread Pool -- 59) Hibernate: drop table if exists hibernate_sequence
23:42:35,136 INFO  [stdout] (ServerService Thread Pool -- 59) Hibernate: create table book (id bigint not null, description varchar(255), illustrations bit, nbOfPage integer, price float, title varchar(255), primary key (id))
23:42:35,137 INFO  [stdout] (ServerService Thread Pool -- 59) Hibernate: create table hibernate_sequence (next_val bigint)
23:42:35,137 INFO  [stdout] (ServerService Thread Pool -- 59) Hibernate: insert into hibernate_sequence values ( 1 )

persist 后运行时:

23:42:56,796 INFO  [stdout] (default task-4) Hibernate: update 
hibernate_sequence set next_val= ? where next_val=?

23:42:56,807 INFO  [stdout] (default task-4) Book "Java book" persisted! // I print this

23:42:56,814 INFO  [stdout] (default task-4) Hibernate: insert into book 
(description, illustrations, nbOfPage, price, title, id) values (?, ?, ?, ?, ?, ?)

pom.xml

    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>


    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <scope>provided</scope>
    </dependency>

我还在持久化后对实体管理器进行了查询,它返回了所有持久化书籍的列表,但它们都不在数据库中。

要求的代码

图书实体:

@Entity
@NamedQuery(name = "Book.findAll", query = "SELECT b FROM Book b")
public class Book implements Serializable {

    @Id @GeneratedValue
    private Long id;

    private String title;  
    private Float price;
    private String description;
    private Integer nbOfPage;  
    private Boolean illustrations;

    public Book() {

    }
    // getters, setters...
}

我像这样在 EJB 中持久化实体:

@Named
@Stateless
public class BookEJB {

    @PersistenceContext(unitName = "punit")
    EntityManager em;

    public Book createNewBook(Book book) {
        em.persist(book);
        System.out.println("Book \"" + book.getTitle() + "\" persisted!");

        return book;
    }
}

更新

我修复了persistence.xml,在standalone.xml中定义了数据源,并将jdbc驱动jar放到了tutorial之后的服务器目录中。

但我得到了这个例外:

23:12:11,374 INFO  [org.jboss.as.jpa] (MSC service thread 1-3) WFLYJPA0002: Read persistence.xml for punit
23:12:11,625 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
("subsystem" => "datasources"),
("data-source" => "MySqlDS")
]) - failure description: {"WFLYCTL0180: Services with missing/unavailable dependencies" => [
"org.wildfly.data-source.MySqlDS is missing [jboss.jdbc-driver.mysql]",
"jboss.driver-demander.java:jboss/datasources/MySqlDS is missing [jboss.jdbc-driver.mysql]"
]}

问题已解决

persistence.xml 中,将&lt;jta-data-source&gt;jdbc/MySqlDS&lt;/jta-data-source&gt; 替换为&lt;jta-data-source&gt;java:jboss/datasources/MySqlDS&lt;/jta-data-source&gt;,这是standalone.xml 文件中我的数据源定义的jndi-name 属性的正确值。

我也错误地将 module.xml 和 jdbc 连接器 jar 放入 modules\system\layers\base\com\mysql\driver\main 中,但它需要转到 modules\system\layers\base\com\mysql\main

似乎我一直在关注其他一些教程以及我帖子中的教程。 ^^

【问题讨论】:

  • 您能否发布相关代码,在其中声明您的实体并持久化它们?
  • @Ish 我发布了代码

标签: java mysql hibernate jpa wildfly-10


【解决方案1】:

让我们看看 JPA 2.1 规范的摘录:

8.2.1.2 交易类型

transaction-type属性用于指定实体管理器工厂为持久化单元提供的实体管理器必须是JTA实体管理器还是资源本地实体管理器。此元素的值为 JTARESOURCE_LOCALJTA 的事务类型假定将提供 JTA 数据源——由 jta-data-source 元素指定或由容器提供。通常,在 Java EE 环境中,事务类型 RESOURCE_LOCAL 假定将提供非 JTA 数据源。 在Java EE环境中,如果不指定该元素,则默认为JTA。在Java SE环境中,如果不指定该元素,则默认为RESOURCE_LOCAL。

您尚未在 persistence-unit 元素中指定 transaction-type 属性。因此,根据规范(请参阅上面突出显示的部分),您的默认值为 JTA

8.2.1.5 jta 数据源,非 jta 数据源

在 Java EE 环境中,jta-data-source 和 non-jta-data-source 元素用于指定持久性提供程序要使用的 JTA 和/或非 JTA 数据源的 JNDI 名称。如果两者都没有指定,则部署者必须在部署时指定 JTA 数据源或默认的 JTA 数据源必须由容器提供,并且将创建一个 JTA EntityManagerFactory 以 对应它。

您还没有在persistence.xml 中指定jta-data-source 元素,我假设您在部署期间没有指定JTA 数据源。这意味着默认数据源将由容器提供(请参阅规范中突出显示的文本)。

而且这个数据源没有指向你的 MySQL 数据库。 Wildfly 中的默认设置是 H2 数据库,除非您重新配置它。因此,您的程序可能正在默认数据库中创建和填充表。所以需要先在Wildfly中配置一个数据源,并在persistence.xml中指定。

这可能是以下原因:

我还在持久化后对实体管理器进行了查询,它返回了所有持久化书籍的列表,但它们都不在数据库中。

【讨论】:

  • 感谢您提供的信息。我更新了问题,你可以看看吗?
  • persistence.xml 中你提供了一个jta-data-source 元素;所以transaction-type 属性应该有JTA 值。这是对persistence.xml文件的更正,但是Wildfly中的数据源配置似乎有错误;这就是我从例外中猜到的。因此,如果您按照教程完成所有操作,请再次检查配置。
  • 还有一点:&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; 已弃用。所以改用:&lt;provider&gt;org.hibernate.jpa.HibernatePersistenceProvider&lt;/provider&gt;
【解决方案2】:

似乎您插入了一个数据库,但检查了另一个数据库。你能显示数据源配置吗? 附言应该是评论,但评分不够(

【讨论】:

  • 我的项目中没有数据源配置。我认为在 persistence.xml 中定义 PU 就足够了?如果不是如何做到这一点,因为我用谷歌搜索了很多但无法得到它。顺便说一句,这是正确的数据库。
  • @ujulu 说您插入了 h2 基础。您是否使用数据源配置中的 DS jndi 名称? docs.jboss.org/author/display/WFLY10/…
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2013-04-17
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多