Java 是否可以将枚举属性的空值存储到数据库?
我试图使用JPA TopLink将Java中实体的枚举属性的值null存储到Oracle数据库。代码执行时没有异常或警告,但实体未存储在数据库中 该实体的定义如下:Java 是否可以将枚举属性的空值存储到数据库?,java,database,oracle,jpa,enums,Java,Database,Oracle,Jpa,Enums,我试图使用JPA TopLink将Java中实体的枚举属性的值null存储到Oracle数据库。代码执行时没有异常或警告,但实体未存储在数据库中 该实体的定义如下: @Entity public class LetterDoc { ... @Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true) @Enumerated(EnumType.STRING) p
@Entity
public class LetterDoc {
...
@Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true)
@Enumerated(EnumType.STRING)
private DocDeliveryTypeEnum deliveryType;
...
}
枚举类DocDeliveryTypeEnum只有必需的值
public enum DocDeliveryTypeEnum {
NORMAL,
RECOMMENDED,
ACKNOWLEDGEMENT
}
在我的情况下,我有deliveryType有意义并且是必需的实体实例。但是,在某些情况下,deliveryType是不相关的,我想将其保留为null。我不想设置默认值,因为这种情况下没有足够的值
实体实例的值设置为null,但是当我尝试在数据库中持久化和刷新实例时,它只是没有被存储,尽管该列被定义为启用null值的VARCHAR2(20)
情况是这样的:
LetterDoc let = new LetterDoc();
// settery ostatnich atributu
let.setDeliveryType(null);
try {
emptyDocDAO.persist(let);
emptyDocDAO.flush();
} catch (Exception e) {
// no exception is really catched :(
log.error(e);
}
// here I have the id of the entity
实际上,持久化时不会引发异常,只是不存储实体。当我稍后尝试通过ID在另一个线程中获取实体时,它会失败,并出现NoResultException
是否有可能实现这一点,或者我真的必须在持久化之前为所有枚举属性设置一个值?我真的必须在Enum类中创建默认值吗
我通过设置在特定情况下没有多大意义的默认值解决了问题。不过,我想知道是否还有其他选择
非常感谢您的经验和建议。是的,您可以为枚举属性存储null 我看不出你怎么可能什么都得不到,是不是发生了一个异常,你没有抓住
在finest上启用日志记录并包含日志和代码,捕获任何异常并包含堆栈跟踪。当您试图将null值保存到enum时,代码应抛出NullPointerException。 如果name为null,则Enum.valueOf()方法将抛出NullPointerException
let.setDeliveryType(null) 它应该能够在列中保存null。显示您尝试执行此操作的代码,以及获得的异常的完整堆栈跟踪。在您的枚举成员中尝试此操作:columnDefinition=“char(20)default'NULL'”@JBNizet:I确实没有得到任何异常。这就是我最想知道的:(我添加了一些代码来显示我如何存储实体。然而,即使在捕获异常时,也不会抛出和捕获任何内容:(