Извлечение данных из БД с помощью Hibernate

230
23 марта 2017, 19:34

Здравствуйте,

осваиваю Hibernate фреймворк. Возникло следующее затруднение.

Есть программа которая создает 2 объекта типа Employee и 1 типа Department.

public class App {


  public static void main(String[] args) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    Department department = new Department("java");
    session.save(department);
    session.persist(new Employee("Jakab Gipsz",department));
    session.persist(new Employee("Captain Nemo",department));

    session.getTransaction().commit();
    Query q = session.createQuery("From Employee ");
    List<Employee> resultList = q.list();
    System.out.println("num of employess:" + resultList.size());

    for (Employee next : resultList) {
        System.out.println("next employee: " + next);
    }

 }
}

И в конце в консоле выдается надпись:

num of employess:2 next employee: Employee [id=2, name=Jakab Gipsz, department=java] next employee: Employee [id=3, name=Captain Nemo, department=java]

После проверяю базу данных (использую apache derby) там все эти данные есть.

Далее в качестве эксперимента я хочу извлечь данные и в этот раз я запускаю уже программу:

 public class App {


  public static void main(String[] args) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Query q = session.createQuery("From Employee ");
    List<Employee> resultList = q.list();
    System.out.println("num of employess:" + resultList.size());

    for (Employee next : resultList) {
        System.out.println("next employee: " + next);
    }
  }
}

Программа в консоли выдает

num of employess:0

И после выполнения этой программы созданная ранее в БД таблица стирается.

Подскажите пожалуйста почему я не могу извлечь данные во 2ой сессии, и как это правильно сделать, чтобы данные не стирались ?

==============================

Файл настроек "hibernate.cfg.xml":

<property name="connection.url">
 jdbc:derby://localhost:1527/Test;create=true;user=dd;password=123
</property>
<property name="connection.username">dd</property>
<property name="connection.password">123</property>
<property name="dialect">
org.hibernate.dialect.DerbyDialect
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>

 <mapping class="com.mastertheboss.domain.Employee" />
 <mapping class="com.mastertheboss.domain.Department" />

Класс Employee:

@Entity
@Table
public class Employee {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
private Department department;
public Employee() {}
public Employee(String name, Department department) {
    this.name = name;
    this.department = department;
}

public Employee(String name) {
    this.name = name;
}
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Department getDepartment() {
    return department;
}
public void setDepartment(Department department) {
    this.department = department;
}
@Override
public String toString() {
    return "Employee [id=" + id + ", name=" + name + ", department="
            + department.getName() + "]";
}
}
Answer 1

У Вас в файле hibernate.cfg.xml стоит параметр

<property name="hbm2ddl.auto">create</property> 

он означает, что таблицы будут создаваться каждый раз при запуске проекта.

Можно заменить create на update и тогда таблицы в БД не будут пересоздаваться, а будут обновляться с текущими настройками сущностей, т.е. добавление колонок, новых таблиц (все данные в таблице при этом должны остаться). Или после первого запуска приложение закомментируйте этот параметр.

READ ALSO
Отправка сообщения от сервера к клиенту через сокет

Отправка сообщения от сервера к клиенту через сокет

В потоке run() строка: clientSocketgetOutputStream()

297
Невозможно найти файл конфигурации log4j2

Невозможно найти файл конфигурации log4j2

Почему невозможно найти log4j2 файл конфигурации хотя файл добавленПути файла менял на различные, все равно не находит

379
Создание строки в цикле и оптимизация кода

Создание строки в цикле и оптимизация кода

Как будет правильнее (и займёт меньше времени при выполнении), если на каждой итерации цикла создаётся новая строка?

217