2016-11-30 1 views
1

Ich muss mit möglichen Werten 1 ein Geschlecht Feld Mitarbeiter Tabelle füllen, die -> Männlich, 2 -> WeiblichEinfügen von Enum-Werte Tabelle überwintern mit

Hibernate Mapping für die Tabelle:

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; 
    } 




} 

Geschlecht 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; 
    } 

} 

Converter:

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); 
    } 

} 

ich den folgenden Code verwenden, um die Einheit zu ändern, Bohnen

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); 

innerhalb Repository.

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); 
     } 
    } 

Aber auf die Werte der Tabelle einfügen, wird der Enum die Standardwerte für Male & Female dh Einstellung. 0 & 1 jeweils.

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

Wie kann ich den Wert 1 & 2 stattdessen setzen?

+0

wintern Gibt es einen externen Grund, warum Sie benötigen nicht-Standardzeichen zu benutzen? – chrylis

+0

@chrylis. Ich habe es zu Studienzwecken gemacht. – Renjith

+0

Wenn Sie Postgres verwenden, kann Hibernate Datenbank-Enum-Typen verwenden, um das Beste aus beiden Welten zu erhalten - lesbare Werte in einer SELECT-Anweisung und Integer-Speed-Lookup. – chrylis

Antwort

1

Es ist besser, die enum als String in der DB zu speichern und seine ID aus der Anwendung mit der enum abzurufen.

Sie sind die EnumType.ORDINAL der enum persistierenden, die von 0 beginnt, ist das der Grund, 0 und 1 werden immer in DB

beibehalten Wenn Sie die ID des Enum beharrte werden Sie Coverter Anmerkung

können

Convert in JPA2.1 (Hibernate 4.3 und höher) hinzugefügt

Entity

@Entity 
public class Employee { 

    @Id 
    @GeneratedValue 
    Long id; 

    @Column 
    String name; 

    @Column 
    int age; 

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

Konverter

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 Erstellt von

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

sieht vielversprechend aus ..... weiß aber nicht warum es immer noch nicht funktioniert !! Meine Frage aktualisiert – Renjith

+0

Ich habe JPA mit Hibernate verwendet, haben Sie die Konvertermethoden debuggen? – Saravana

+0

Ja, es geht nicht einmal in diese Methoden. Ich habe sogar @Converter Annotation auf Klassenebene versucht. – Renjith

Verwandte Themen