Hibernate save() возвращает 0

317
31 августа 2017, 18:34

Добрый день всем. Я новичок в Hibernate и пытаюсь написать свое первое приложение с использованием этого фреймворка.

Проблема заключается в следующем, при сохранении сущности в базу функция save() по описанием документации должна возвращать "id" которое присваивается записи в БД, но по какой-то причине у меня всегда 0.

Подскажите пожалуйста, что делать?

Объект сущность package POJO;

import javax.persistence.*;
@Entity
@Table(name = "Employee")
public class Employee {
@Id @GeneratedValue()
@Column(name = "id",unique = true, nullable = false)
private int id;
@Basic
@Column(name = "first_name", nullable = true, length = 20)
private String firstName;
@Basic
@Column(name = "last_name", nullable = true, length = 20)
private String lastName;
@Basic
@Column(name = "salary", nullable = true)
private Integer salary;
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}
public Integer getSalary() {
    return salary;
}
public void setSalary(Integer salary) {
    this.salary = salary;
}
}

Конфигурационный файл Hibernate для сущности Employee

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="POJO.Employee" table="employee" schema="company">
    <id name="id">
        <column name="id" sql-type="int(11)"/>
    </id>
    <property name="firstName">
        <column name="first_name" sql-type="varchar(20)" length="20" not-null="true"/>
    </property>
    <property name="lastName">
        <column name="last_name" sql-type="varchar(20)" length="20" not-null="true"/>
    </property>
    <property name="salary">
        <column name="salary" sql-type="int(11)" not-null="true"/>
    </property>
</class>
</hibernate-mapping>

Класс для управления с CRUD package Service;

import POJO.Employee;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
public class ManagementEmployee {
private SessionFactory sessionFactory;
public ManagementEmployee(){
   Configuration conf = new 
Configuration().addAnnotatedClass(Employee.class).configure();
   sessionFactory = conf.buildSessionFactory();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, Integer salary){
    Session session = sessionFactory.openSession();
    Transaction transaction = null;
    Integer employeeID = null;
    try{
        transaction = session.beginTransaction();
        Employee employee = new Employee();
        employee.setFirstName(fname);
        employee.setLastName(lname);
        employee.setSalary(salary);
        employeeID = (Integer) session.save(employee);
        transaction.commit();
    }catch (HibernateException e) {
        if (transaction!=null) transaction.rollback();
        e.printStackTrace();
    }finally {
        session.close();
    }
    return employeeID;
}
/* Method to  READ all the employees */
public void listEmployees( ){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try{
        tx = session.beginTransaction();
        List employees = session.createQuery("From Employee").list();
        for (Iterator iterator =
             employees.iterator(); iterator.hasNext();){
            Employee employee = (Employee) iterator.next();
            System.out.print("First Name: " + employee.getFirstName());
            System.out.print("  Last Name: " + employee.getLastName());
            System.out.println("  Salary: " + employee.getSalary());
        }
        tx.commit();
    }catch (HibernateException e) {
        if (tx!=null) tx.rollback();
        e.printStackTrace();
    }finally {
        session.close();
    }
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, Integer salary ){
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try{
        tx = session.beginTransaction();
        Employee employee = session.get(Employee.class, EmployeeID);
        employee.setSalary(salary);
        session.update(employee);
        tx.commit();
    }catch (HibernateException e) {
        if (tx!=null) tx.rollback();
        e.printStackTrace();
    }finally {
        session.close();
    }
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID) {
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();
        Employee employee =
                (Employee) session.get(Employee.class, EmployeeID);
        session.delete(employee);
        tx.commit();
    } catch (HibernateException e) {
        if (tx != null) tx.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
}
}

Класс Main

import Service.ManagementEmployee;
public class Main {
public static void main(String[] args) {
    System.out.println("Start use Hibernate");
    ManagementEmployee me = new ManagementEmployee();
  /* Add few employee records in database */
    Integer empID1 = me.addEmployee("Zara", "Ali", 1000);
    Integer empID2 = me.addEmployee("Daisy", "Das", 5000);
    Integer empID3 = me.addEmployee("John", "Paul", 10000);
  /* List down all the employees */
    me.listEmployees();
  /* Update employee's records */
    System.out.println(empID1);
    System.out.println(empID2);
    System.out.println(empID3);
}
}

Конфигурационный файл

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/company</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">7028015</property>
<property name="connection.pool_size">1</property>
<!-- SQL Dialect-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <!-- Mapping class -->
<mapping class="POJO.Employee"/>
<mapping resource="POJO/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>

База данный MySQL Таблица в БД

CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(20) DEFAULT NULL,
`last_name` varchar(20) DEFAULT NULL,
`salary` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

Заранее спасибо!

Answer 1

Идентификатор для сущности присваивается на основе стратегии генерации идентификаторов, которая задается аннотацией @GeneratedValue. В вашем случае, идентификатор основан на авто-инкременте первичного ключа в БД, поэтому используйте следующий вариант:

@GeneratedValue(strategy = GenerationType.IDENTITY)
READ ALSO
Сформировать отчет, данные выгрузить из TrackStudio

Сформировать отчет, данные выгрузить из TrackStudio

Всем привет! Мне необходимо совместить два скрипта(два файла находятся по ссылке -> yadisk/d/kXrezA-o3MSnyu) в один единый скрипт, который будет брать...

271
Невозможно разрешить метод

Невозможно разрешить метод

Добрый деньВо Fragmente обрабатываю json и при помощи кастомного адаптера отправляю в лист вью

294
Как правильно называть имена классов в Java?

Как правильно называть имена классов в Java?

Как правильно называть имена классов в Java?

351
Как найти среднее (медиану) из трёх чисел?

Как найти среднее (медиану) из трёх чисел?

Имеется три числа: 10, 20, 30Как найти среднее из них (не самое большое и не самое маленькое), без множества условий?

452