[英]Hibernate not persisting entity to MySql - Wildfly 10
我正在使用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 )
在運行后堅持:
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放在本教程之后的服務器目錄中。
但是我得到這個異常:
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
將<jta-data-source>jdbc/MySqlDS</jta-data-source>
替換為<jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
,這是正確的standalone.xml
文件中我的數據源定義的jndi-name
屬性的值。
我也錯誤地將module.xml
和jdbc連接器jar放在modules\\system\\layers\\base\\com\\mysql\\driver\\main
但它需要轉到modules\\system\\layers\\base\\com\\mysql\\main
。
似乎我一直在跟着其他一些教程以及我帖子中的那個教程。 ^^
讓我們看一下JPA 2.1規范的摘錄:
8.2.1.2交易類型
transaction-type屬性用於指定實體管理器工廠為持久性單元提供的實體管理器必須是JTA實體管理器還是資源本地實體管理器。 該元素的值為JTA或RESOURCE_LOCAL 。 JTA的事務類型假定將提供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
指定。
這可能是以下原因:
持久化之后,我還在實體管理器上運行了查詢,它向我返回了所有持久化書籍的列表,但是它們都不在數據庫中。
好像您插入一個數據庫,但檢查另一個數據庫。 您可以顯示數據源配置嗎? PS應該是評論,但沒有足夠的評分(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.