2016-11-30 4 views
1

мне нужно заполнить таблицу Сотрудник, имеющий Пол поле с возможными значениями 1 -> Мужчина, 2 -> Женскийзначения Вставка перечислений в таблицу, используя спящий режим

Hibernate Mapping для таблицы:

package test.hib.entity; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Convert; 
import javax.persistence.Entity; 
import javax.persistence.EnumType; 
import javax.persistence.Enumerated; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

import test.hib.enumtest.GenderConverter; 

@Entity 
@Table(name="Employee") 
public class Employee implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -2531499686831259894L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int employeeId; 

    @Column 
    private String employeeName; 

    @Column 
    @Convert(converter=GenderConverter.class) 
    private Gender gender; 

    public int getEmployeeId() { 
     return employeeId; 
    } 

    public void setEmployeeId(int employeeId) { 
     this.employeeId = employeeId; 
    } 

    public String getEmployeeName() { 
     return employeeName; 
    } 

    public void setEmployeeName(String employeeName) { 
     this.employeeName = employeeName; 
    } 

    public Gender getGender() { 
     return gender; 
    } 

    public void setGender(Gender gender) { 
     this.gender = gender; 
    } 




} 

Пол Enum:

package test.hib.entity; 

public enum Gender { 
    MALE(1), 
    FEMALE(2); 

    private int value; 

    private Gender(int value){ 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 



    public static Gender getGender(Integer id) { 
     if (id == null) 
      return null; 
     for (Gender g : values()) { 
      if (g.getValue() == id) 
       return g; 
     } 
     return null; 
    } 

} 

Преобразователь:

package test.hib.enumtest; 

import javax.persistence.AttributeConverter; 
import javax.persistence.Converter; 

import test.hib.entity.Gender; 

@Converter 
public class GenderConverter implements AttributeConverter<Gender, Integer>{ 

    @Override 
    public Integer convertToDatabaseColumn(Gender arg0) { 
     if(arg0 != null) return arg0.getValue(); 
     return null; 
    } 

    @Override 
    public Gender convertToEntityAttribute(Integer arg0) { 
     // TODO Auto-generated method stub 
     return Gender.getGender(arg0); 
    } 

} 

Я использую следующий код, чтобы изменить сущность,

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml"); 
HibEnumRepo repository = (HibEnumRepo)applicationContext.getBean(HibEnumRepo.class); 

Employee employee = new Employee(); 
employee.setEmployeeName("Renjith"); 
employee.setGender(Gender.MALE); 


repository.insertEmployee(employee); 

Employee employee2 = new Employee(); 
employee2.setEmployeeName("Renju"); 
employee2.setGender(Gender.FEMALE); 


repository.insertEmployee(employee2); 

внутри хранилища боба.

package test.hib.enumtest; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

import test.hib.entity.Employee; 

    @Repository 
    public class HibEnumRepo { 

     @Autowired 
     private SessionFactory sessionFactory; 

     @Transactional 
     public void insertEmployee(Employee employee){ 
      Session session = sessionFactory.getCurrentSession(); 

      session.save(employee); 
     } 
    } 

Но при вставке значения в таблицу, Enum устанавливают значения по умолчанию для мужского & Женских то есть. 0 & 1 соответственно.

mysql> select * from Employee; 
+------------+--------------+--------+ 
| employeeId | employeeName | gender | 
+------------+--------------+--------+ 
|   1 | Renjith  |  0 | 
|   2 | Renju  |  1 | 
+------------+--------------+--------+ 
2 rows in set (0.00 sec) 

Как я могу установить значение 1 & 2 вместо этого?

+0

Есть ли какая-то внешняя причина, почему вы должны использовать нестандартные цифры? – chrylis

+0

@chrylis. Я сделал это для цели обучения. – Renjith

+0

В качестве заметки широкого уровня, если вы используете Postgres, Hibernate может использовать типы перечислений базы данных, чтобы получить лучшее из читаемых в мире значений в инструкции SELECT и поиске по целочисленной скорости. – chrylis

ответ

1

Лучше хранить enum как String в БД и получить его идентификатор из приложения, используя enum.

Вы сохраняющиеся в EnumType.ORDINAL в enum, который начинается с 0, то есть причиной, 0 и 1 становится сохранялись в БД

Если вы хотите идентификатор перечисления на настаиваться вы можете использовать Coverter аннотацию

Преобразовать добавлен в JPA2.1 (Спящий 4.3+)

Сущность

@Entity 
public class Employee { 

    @Id 
    @GeneratedValue 
    Long id; 

    @Column 
    String name; 

    @Column 
    int age; 

    @Column 
    @Convert(converter = GenderConverter.class) 
    Gender gender; 
} 

конвертер

public class GenderConverter implements AttributeConverter<Gender, Integer> { 

    @Override 
    public Integer convertToDatabaseColumn(Gender gender) { 
     if (gender == null) 
      return null; 
     return gender.getId(); 
    } 

    @Override 
    public Gender convertToEntityAttribute(Integer id) { 
     return Gender.getGender(id); 
    } 

} 

Enum

public enum Gender { 
    MALE(1), FEMALE(2); 
    int id; 

    private Gender(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

    public static Gender getGender(Integer id) { 
     if (id == null) 
      return null; 
     for (Gender g : values()) { 
      if (g.getId() == id) 
       return g; 
     } 
     return null; 
    } 
} 

DDL Создано зимуют

Hibernate: create table employee (id bigint generated by default as identity, age integer, gender integer, name varchar(255), primary key (id)) 
+0

выглядит многообещающим ..... но не знаю, почему он все еще не работает! Обновлен мой вопрос – Renjith

+0

Я использовал JPA с Hibernate, вы отлаживали методы конвертера? – Saravana

+0

Да, это даже не входит в эти методы. Я даже попробовал аннотацию @Converter на уровне класса. – Renjith

Смежные вопросы