Hibernate не сохраняющийся объект в 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
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 )
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>

At server start:

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 (?, ?, ?, ?, ?, ?)

пом.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 и поместил jar-файл драйвера jdbc в каталог сервера, следуя этому руководство.

Но я получаю это исключение:

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>, что было правильным значением атрибута jndi-name моего определения источника данных внутри файла standalone.xml.

Кроме того, я неправильно поместил module.xml и jar-коннектор jdbc внутрь modules\system\layers\base\com\mysql\driver\main, но вместо этого он должен перейти к modules\system\layers\base\com\mysql\main.

Кажется, я следил за другим учебником наряду с тем, что в моем посте. ^^


person pavlee    schedule 02.10.2017    source источник
comment
Можете ли вы опубликовать соответствующий код, в котором вы объявляете свои сущности и сохраняете их?   -  person Ish    schedule 02.10.2017
comment
@Ish я разместил код   -  person pavlee    schedule 03.10.2017


Ответы (2)


Давайте посмотрим выдержки из спецификации JPA 2.1:

8.2.1.2 тип транзакции

Атрибут типа транзакции используется для указания того, должны ли менеджеры сущностей, предоставляемые фабрикой менеджеров сущностей для единицы сохраняемости, быть менеджерами сущностей JTA или локальными менеджерами сущностей ресурсов. Значение этого элемента — JTA или RESOURCE_LOCAL. Транзакционный тип JTA предполагает, что будет предоставлен источник данных JTA — либо указанный в элементе jta-data-source, либо предоставленный контейнером. Как правило, в средах Java EE тип транзакции RESOURCE_LOCAL предполагает, что будет предоставлен источник данных, отличный от JTA. Если в среде Java EE этот элемент не указан, по умолчанию используется значение JTA. В среде Java SE, если этот элемент не указан, по умолчанию используется значение RESOURCE_LOCAL.

Вы не указали атрибут transaction-type в элементе persistence-unit. Итак, согласно спецификации (см. выделенную часть выше), у вас есть значение по умолчанию, которое равно JTA.

8.2.1.5 jta-источник данных, не-jta-источник данных

В средах Java EE элементы jta-data-source и non-jta-data-source используются для указания имени JNDI источника данных JTA и/или не-JTA, который будет использоваться поставщиком сохраняемости. Если ни один из них не указан, разработчик должен указать источник данных JTA при развертывании или источник данных JTA по умолчанию должен быть предоставлен контейнером, и для него будет создана JTA EntityManagerFactory.

Вы также не указали элемент jta-data-source в своем persistence.xml, и я предполагаю, что вы не указали источник данных JTA во время развертывания. Это означает, что источник данных по умолчанию будет предоставлен контейнером (см. выделенный текст в спецификации).

И этот источник данных не указывает на вашу базу данных MySQL. По умолчанию в Wildfly, если вы не перенастроили его, используется база данных H2. Таким образом, ваша программа может создавать и заполнять таблицы в базе данных по умолчанию. Поэтому вам нужно сначала настроить источник данных в Wildfly и указать его в файле persistence.xml.

Это может быть причиной:

Я также выполнил запрос в диспетчере сущностей после сохранения, и он возвращает мне список всех сохраненных книг, но ни одна из них не находится в базе данных.

person ujulu    schedule 02.10.2017
comment
Спасибо за информацию. Обновил вопрос можешь кинуть глянуть? - person pavlee; 03.10.2017
comment
В persistence.xml вы предоставили элемент jta-data-source; поэтому атрибут transaction-type должен иметь значение JTA. Это исправление файла persistence.xml, но в конфигурации источника данных в Wildfly, похоже, есть ошибка; это то, что я предполагаю из исключения. Так что проверьте конфигурацию еще раз, если вы все сделали по инструкции. - person ujulu; 03.10.2017
comment
Еще одна вещь: <provider>org.hibernate.ejb.HibernatePersistence</provider> устарела. Поэтому используйте вместо этого: <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> - person ujulu; 03.10.2017

Вроде как в одну бд вставляешь, а проверяешь другую бд. Не могли бы вы показать конфигурацию источника данных? P.S. Комментарий должен быть, а рейтинга мало(

person Zufar Muhamadeev    schedule 02.10.2017
comment
В моем проекте нет конфигурации источника данных. Я думал, что достаточно определить PU в файле persistence.xml? Если нет, то как это сделать, потому что я много гуглил, но не могу понять. Кстати, это правильная база данных. - person pavlee; 02.10.2017
comment
@ujulu говорит, что вы вставляете в базу h2. Используете ли вы имя DS jndi из конфигурации источника данных? docs.jboss.org/author/display/WFLY10/ - person Zufar Muhamadeev; 03.10.2017