Spring JPA - 枚举中枚举字段的默认值

时间:2015-06-08 11:11:34

标签: java spring hibernate jpa enums

我们有一个包含枚举字段的实体 - emailCommunicationStatus,我们希望使用JPA注释为'UNKNOWN'设置默认值。

但是,当我们将实体保存到数据库时,此字段的值为null而不是isLocked。对于布尔字段 - false,将保存正确的默认值(@Entity public class Account { @Id @GeneratedValue @Column(name = "id") protected Long id; @Column(columnDefinition = "boolean default false") private boolean isLocked; @Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'") @Enumerated(value = EnumType.STRING) private CommunicationStatus emailCommunicationStatus; PlayerAccount() { super(); } } public enum CommunicationStatus { VALID, INVALID, DONT_CONTACT, UNKNOWN; } )。

@Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'")

如果我们改为emailCommunicationStatus使用com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'emailCommunicationStatus' cannot be null ,我们会在保存时收到以下异常:

//project1/build.gradle
dependencies{
    compile project(":project2")
}

我们做错了什么?为什么它只适用于布尔值?

3 个答案:

答案 0 :(得分:15)

当一些SQL代码插入行而没有为emailCommunicationStatus列指定任何值时,您所做的是有用的。在这种情况下,该行将具有“UNKNOWN”作为此列的值:

emailCommunicationStatus

但是Hibernate永远不会做这样的插入。它将始终传递此实体的insert into account (id, isLocked, emailCommunicationStatus) values(1, false, null) 字段的实际值。因此,如果将其保留为null,它将在数据库中明确地将其设置为null:

@Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'")
@Enumerated(value = EnumType.STRING)
private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN;

您想要的是设置此字段的默认值:

isLocked

它适用于public void XMPPAddNewPrivacyList(XMPPConnection connection, String userName) { String listName = "newList"; List<PrivacyItem> privacyItems = new Vector<PrivacyItem>(); PrivacyItem item = new PrivacyItem(PrivacyItem.Type.jid.toString(), false, 1); item.setValue(userName); privacyItems.add(item); // Create the new list. try { PrivacyListManager privacyManager = new PrivacyListManager(connection); privacyManager = PrivacyListManager .getInstanceFor(connection); privacyManager.createPrivacyList(listName, privacyItems); } catch (XMPPException e) { System.out.println("PRIVACY_ERROR: " + e); } } ,因为布尔字段的默认值为false。

答案 1 :(得分:2)

只需初始化Entity字段即可。 Hibernate将使用已设置的值实例化实体类。当它刷新时,将插入具有指定值的字段。

private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN;

此致

答案 2 :(得分:0)

除了添加列定义之外,您还可以设置动态查询。但请检查下面的评论,因为这种做法似乎是不鼓励的。

如果你正在使用hibernate版本&lt; 4你应该用

注释你的实体
@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
  

当dynamic-insert属性设置为true时,Hibernate会这样做   不包括属性的空值(对于未设置的属性)   通过应用程序)在INSERT操作期间。随着   dynamic-update属性设置为true,Hibernate不包含   UPDATE操作中未修改的属性。

对于hibernate版本&gt; 4你应该使用@DynamicUpdate代替。同样在java代码中初始化也是一个很好的建议。