是否可以将枚举属性的空值存储到数据库中?

时间:2012-07-11 09:28:11

标签: java database oracle jpa enums

我正在尝试将 Java 中实体的枚举属性的 null 值存储到 Oracle 数据库使用JPA TopLink。代码执行时没有异常或警告,但实体未存储在数据库中。

实体定义如下:

@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类中创建默认值吗?

我通过设置一个在特定情况下没有多大意义的默认值来解决我的问题。但是,我想知道是否还有其他选择。

非常感谢您的经验和建议。

2 个答案:

答案 0 :(得分:1)

是的,您可以为枚举属性存储null。

我看不出你怎么能得不到任何东西,是不是你不能抓住的例外?

启用最好的日志记录并包含日志和代码,并捕获任何异常并包含堆栈跟踪。

答案 1 :(得分:0)

当您尝试将null值保存到枚举时,代码应该抛出NullPointerException。 如果name为null,则Enum.valueOf()方法抛出NullPointerException。

let.setDeliveryType(空);