использование hibernate 5 как создать таблицу со строкой во время первого выполнения?

#java #mysql #hibernate #spring-mvc #jpa

#java #mysql #гибернация #spring-mvc #jpa

Вопрос:

я хочу вставить строку в таблицу, как во время создания таблицы, но Hibernate 5 успешно создает таблицу, но не вставляет заданную строку по умолчанию, как в примере ниже,

я уже пробовал приведенный ниже код,

 @Entity
public class FTPDomain {
@Id
private Long id=(long)1;

private String transferCroneTime="0 0 0 29 2 ?";

private String cleanCroneTime="0 0 0 29 2 ?";

//Setters amp; Getters
}
  

и я тоже пытался ,

  @PrePersist
    public void prePersist() {
        if(id == null) id = (long)1;
        if(transferCroneTime == null) transferCroneTime ="0 0 0 29 2 ?";
        if(cleanCroneTime == null) cleanCroneTime = "0 0 0 29 2 ?"
    }
  

я ожидаю, когда FTPDomain.java скомпилируйте и выполните первый раз, создайте таблицу со СТРОКОЙ, где id = 1, transferCroneTime= 0 0 0 29 2 ? и cleanCroneTime = 0 0 0 29 2 ? в таблице.

Спасибо…

Комментарии:

1. Ваши ожидания просто нереалистичны. Этого не произойдет. Если вы хотите, чтобы какое-либо приложение создало экземпляр объекта и сохранило его, вам нужно написать этот код. Hibernate не догадается о ваших намерениях и сделает это за вас.

2. Спасибо за ответ, я уже использовал @prePersist, но он также не создает СТРОКУ в моей таблице. пожалуйста, смотрите отредактированный вопрос.

3. prePersist — это перехват, который вызывается каждый раз, когда вы сохраняете объект этого типа. Удалите это. Опять же: Hibernate не сохранит для вас ни одного объекта.

4. Уважаемый, так как же добавить строку во время создания таблицы в этой ситуации.

5. Я использую FlywayDB или Liquibase для создания (и предварительного заполнения, если необходимо) моей схемы базы данных. Это лучшее решение, которое вы также можете использовать в производстве (в отличие от автоматического создания таблиц в hibernate). Если вы все еще хотите продолжать использовать hibernate для создания своих таблиц и хотите, чтобы некоторые данные были вставлены, напишите код для вставки этих данных и выполните его при запуске вашего приложения.

Ответ №1:

@prePersist и @preUpdate — это прослушиватель событий JPA, которые предназначены для изменения состояний объекта до того, как объект будет сохранен или обновлен, как уже упоминалось в комментариях. Смотрите Следующие примеры для правильного использования этих прослушивателей событий.

 @PrePersist
public void prePersist() {
   creationDate = Localdatetime.now();
   updatedDate = Localdatetime.now();
} 

@PreUpdate
public void preUpdate() {
   updatedDate = Localdatetime.now();
} 
  

Если вы хотите предварительно заполнить данные в свежесозданную схему, то вам необходимо использовать механизмы, описанные в этой статье https://thoughts-on-java.org/standardized-schema-generation-data-loading-jpa-2-1 /, посредством чего вы настраиваете его в своем persistence.xml через параметр javax.persistence.sql-load-script-source, который указывает на sql-скрипт, который загружает данныес помощью инструкций insert в вашу базу данных.

Существуют также специфические свойства hibernate, которые обеспечивают ту же функциональность, что и описанные в документах https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#_importing_script_files , но я бы рекомендовал использовать специфические для JPA.