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

Sha*_*arg 6 java database oracle enums jpa

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

该实体定义如下:

@Entity
public class LetterDoc {
    ...
    @Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true)
    @Enumerated(EnumType.STRING)
    private DocDeliveryTypeEnum deliveryType;
    ...
}
Run Code Online (Sandbox Code Playgroud)

Enum类DocDeliveryTypeEnum只有必需的值.

public enum DocDeliveryTypeEnum {
    NORMAL,
    RECOMMENDED,
    ACKNOWLEDGEMENT
}  
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我有实体的实例,其中deliveryType是sence并且是必需的.但是,在某些情况下,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
Run Code Online (Sandbox Code Playgroud)

持久化时不会抛出任何异常,只是实体未存储.当我尝试通过ID稍后在另一个线程中获取实体时,它会因NoResultException而失败.

有没有机会使这项工作,或者我真的必须在持久之前为所有枚举属性设置一个值?我真的必须在Enum类中创建默认值吗?

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

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

Jam*_*mes 1

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

我不明白你怎么什么也得不到,是否发生了你没有捕获的异常?

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