我正在尝试使用 JPA TopLink将Java中实体的枚举属性的空值存储到Oracle数据库。代码执行时没有异常或警告,但实体未存储在数据库中。
实体定义如下:
@Entity
public class LetterDoc {
...
@Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true)
@Enumerated(EnumType.STRING)
private DocDeliveryTypeEnum deliveryType;
...
}
Enum 类 DocDeliveryTypeEnum 只有必需的值。
public enum DocDeliveryTypeEnum {
NORMAL,
RECOMMENDED,
ACKNOWLEDGEMENT
}
在我的情况下,我有一些实体实例,其中deliveryType 有意义并且是必需的。但是,在某些情况下,deliveryType 是无关紧要的,我想将其保留为null。我不想设置默认值,因为这种情况没有足够的值。
实体实例的值设置为 null,但是当我尝试在数据库中持久化和刷新实例时,它只是没有被存储,尽管该列被定义为 VARCHAR2(20) 并启用了 NULL 值。
情况是这样的:
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 类中创建一个默认值吗?
我通过设置在特定情况下没有多大意义的默认值解决了我的问题。但是,我想知道是否还有其他选择。
非常感谢您的经验和建议。