Spring - Как сохранить данные Hibernate на SQL сервере? - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю над приложением Spring с Hibernate. Я хотел бы сохранить данные, чтобы они сохранялись даже при запуске и остановке сервера. При попытке сохранить данные в базе данных SQL я столкнулся с кучей исключений, поэтому я все отбросил и собрал простой, приветственный пример стиля мира, пытаясь сохранить экземпляр Person в базе данных SQL.

Я прошел через все темы, которые смог найти, но все они связаны с отношениями - это всего лишь одна сущность без отношений. Любой совет с благодарностью!

Вот моя попытка сохранить запись:

Person person = new Person("Some Person");
personRepository.save(person);
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(person);
session.getTransaction().commit();

Исключение:

Caused by: org.hibernate.property.access.spi.PropertyAccessException:
Error accessing field [private java.lang.String com.wdw.core.Person.name] by reflection for persistent property [com.wdw.core.Person#name] : com.wdw.core.Person@4a232870
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field com.wdw.core.Person.name to com.wdw.core.Person

Модель:

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long personId;
    private String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    // getters and setters
}

Repository:

public interface PersonRepository  extends CrudRepository<Person, Long> {}

hibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">true</property>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:8889/the_sideline</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="use_sql_comments">true</property>
        <property name="hbm2ddl.auto">create</property>
        <mapping class="com.wdw.core.Person"/>
    </session-factory>
</hibernate-configuration>

РЕДАКТИРОВАТЬ: Когда я создаю пустую базу данных без таблиц и запускаю программу, она создает таблицу Person без записей:

mysql> use test_1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_test_1
+---------------------------+
| Person                    |
+---------------------------+
1 row in set (0.00 sec)

mysql> select * from Person;
Empty set (0.00 sec)

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Все, что я хотел сделать, это сохранить данные между запуском и остановкой сервера и иметь возможность доступа к данным через базу данных SQL. Я решил проблему, не используя @Transactional или Session интерфейс, просто указав базу данных, которую вы хотите использовать в Hibernate. Нашел здесь - спасибо @Master Slave.

Шаги:

  1. Раскрутите мой SQL-сервер и создайте базу данных
  2. Добавьте файл application.properties, чтобы сконфигурировать Spring для использования этой базы данных
  3. При первом запуске приложения установите spring.jpa.hibernate.ddl-auto = на create. В следующий раз установите значение update. Это сохранит эти данные между сеансами.

application.properties: - используйте это только для первого запуска:

spring.datasource.url=jdbc:mysql://localhost:8889/my_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

После bootRun, my_db будет заполнено данными. Остановите сервер Spring и перезапустите его, но на этот раз с spring.jpa.hibernate.ddl-auto=update в вашем application.properties.

Надеюсь, что это поможет кому-то еще, кто сталкивается с аналогичными проблемами.

0 голосов
/ 11 ноября 2018
@Entity

@ Table (имя = "Person") публичный класс Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="person_id")
private long personId;

@Column(name="name")
private String name;

public Person() {
}

public Person(String name) {
    this.name = name;
}

// getters and setters

}

Вам нужно добавить еще несколько аннотаций к этой сущности, как указано в приведенном выше коде. 1) @Column, чтобы hibernate понимал, какой столбец сопоставлен с каким свойством в сущности (это не требуется, если имена столбцов и имена свойств совпадают). Имя столбца таблицы должно быть упомянуто, как указано выше.

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