没有在数据库中保存一个枚举值,为什么?

时间:2019-05-17 04:21:47

标签: java spring jpa

不将枚举值保存在数据库中,我想就是这样,或者我不明白,我试图保存,因为控制台向我显示了数据,但是当我从数据库询问时,我得到了另一个值

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

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "password")
    private String password;

    @Column(unique = true, name = "email")
    private String email;

    @Column(name="rol")
    Rol rol;



    @Column(name = "life")
    Life life;


    public User() {

    }
    }

我在.info中有此邮件,显示此消息“ OWNER”

Set<User> users =new HashSet<>();
            log.info("CONSOLE"+ user.getRol());
            users.add(user);
            meet.setUsers(users);
            return meetRepository.save(meet);

但是大张旗鼓我得到了其他价值 ROL:参与者

[
  {
    "id": 1,
    "name": "string2",
    "state": "pause",
    "bet": {
      "profit": 0,
      "inversion": 0
    },
    "users": [
      {
        "id": 1,
        "name": "string",
        "password": "string",
        "email": "ema",
        "rol": "PARTICIPANT",
        "life": "suspend"
      }
    ]
  }
]

2 个答案:

答案 0 :(得分:1)

如果您的字段角色和生命是枚举,则必须使用@Enumerated将其声明为枚举。有两种选择。默认将存储序数。或者,您可以选择使用字符串名称存储在数据库中。就可维护性而言,这是更好的选择:

@Enumerated(EnumType.STRING)
@Column(name="rol")
Rol rol;

@Enumerated(EnumType.STRING)
@Column(name = "life")
Life life;

两句话:

  1. 当数据库字段具有与属性相同的名称时,可以省略@Column。如果表的名称与实体的名称相同,则@Table注记也是如此。

  2. 阅读有关Enums和JPA的更多信息,如果您真的应该在我的一篇文章中使用它:https://72.services/de/should-you-use-enums-with-jpa/

答案 1 :(得分:0)

如上所述,将枚举保存到数据库时,可以选择将其保存为字符串或数字序数。数值选项非常痛苦,因为每次您需要更新枚举值或更改值的顺序时,都会将字段的数据库选项弄乱。即使将字符串存储在数据库中,另一件事也是非常痛苦的事情是,当您使用某些ORM(例如Hibernate)并且您具有NULL值时。因此,请将枚举保留为字符串,并避免使用NULL值。