gpt4 book ai didi

java - Hibernate map enum 按属性值

转载 作者:行者123 更新时间:2023-12-03 23:19:20 25 4
gpt4 key购买 nike

我正在尝试使用 Hibernate 执行以下操作:

  • 当一个对象被保存到数据库时,它被保存为枚举的 name 属性的值。
  • 当从 DB 检索对象时,该对象从数据库中读取字符串,并通过枚举的 name 属性的值实例化枚举。

  • 让我阐述一下。

    这是枚举:
    public enum Position {

    UNSPECIFIED(1L, "Unspecified"),
    SPECIALIST(2L, "Specialist"),
    NOT_SPECIALIST(3L, "Not Specialist");

    private Long id;
    private String name;

    Position(Long id, String name) {
    this.id = id;
    this.name = name;
    }

    public Long getId() {
    return id;
    }

    public String getName() {
    return name;
    }

    public static Position from(Long id) {
    for(Position position: values()) {
    if(position.getId().equals(id))
    return position;
    }

    throw new IllegalArgumentException("Cannot get position for ID " + id);
    }

    public static Position from(String name) {
    for(Position position: values()) {
    if(position.getName().toUpperCase().equals(name.toUpperCase()))
    return position;
    }

    throw new IllegalArgumentException("No such position " + name);
    }
    }

    这是一个使用枚举的类:
    @Entity(name = "worker")
    public class Worker {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;
    private Position position;
    private String email;
    }

    这是数据在数据库中的显示方式:
    worker
    id first_name last_name position email
    0 Adam Applegate Unspecified adam@company.com
    1 Bob Barrett Specialist bob@company.com

    所以基本上,当我调用 workerRepository.findById(0); 时我取回的 worker 对象具有以下值:
    id --> 0
    firstName --> Adam
    lastName --> Applegate
    position --> Position.UNSPECIFIED
    email --> adam@company.com

    现在,假设我创建了一个具有以下值的新工作对象:
    firstName --> Chad
    lastName --> Carlton
    position --> Position.NOT_SPECIFIED
    email --> chad@company.com

    调用后 workerRepository.save(newWorker);数据库应如下所示:
    id      first_name      last_name       position        email
    0 Adam Applegate Unspecified adam@company.com
    1 Bob Barrett Specialist bob@company.com
    2 Chad Carlton Not Specialist chad@company.com

    请注意,位置列的值为 Position.NOT_SPECIALIST.getName()。

    有没有办法在 hibernate 中做到这一点?

    最佳答案

    正如@chrylis 所建议的,我的问题的答案是使用 AttributeConverter ,像这样:

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

    @Converter(autoApply = true)
    public class PositionConverter implements AttributeConverter<Position, String> {

    @Override
    public String convertToDatabaseColumn(Position attribute) {
    return attribute.getName();
    }

    @Override
    public VolleyballPlayerPosition convertToEntityAttribute(String dbData) {
    return Position.from(dbData);
    }
    }

    关于java - Hibernate map enum 按属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41625756/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com