java - 使用 hibernate 将枚举值插入表

标签 java mysql hibernate enums

我需要用可能的值 1--> 男性,2 --> 女性填充具有性别字段的员工表

表的 Hibernate 映射:

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




}

性别枚举:

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

内部存储库 bean。

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

但是在将值插入表时,枚举设置了男性和女性的默认值,即。分别为 0 和 1。

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

我如何设置值 1 和 2?

最佳答案

最好将 enum 作为 String 存储在数据库中,并使用 enum 从应用程序中检索它的 id。

您正在保留从 0 开始的 enumEnumType.ORDINAL,这就是 0 和 1 在 DB 中保留的原因

如果你希望枚举的 id 被持久化,你可以使用 Coverter 注释

转换在 JPA2.1 (Hibernate 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);
    }

}

枚举

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

由hibernate创建的DDL

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

关于java - 使用 hibernate 将枚举值插入表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879835/

相关文章:

mysql - 我的 sql : PacketTooBigException: Packet for query is too large (4, 739,923 > 65,535)

java - 一个数据库中的表可以为不同数据库中的另一个表声明一对多声明吗

java - 如何通过LipeRMI传输图像(Blob)?

java - 如何获取属性值?(javax.xml.bind.annotation)

java - 非整数计数包 Map<Object, BigDecimal>

mysql - 按多列选择不同的行并检索未参与确定独特性的另一列

java - 在 Java 小程序中加载图像 AccessControlError

mysql - 限制mysql关系表

java - hibernate 中的关系问题

Spring 3.1.1 + Hibernate 4.1.0 - 不建立索引?