我们有一个包含枚举字段的实体 - 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")
}
我们做错了什么?为什么它只适用于布尔值?
答案 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代码中初始化也是一个很好的建议。