Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将枚举属性的空值存储到数据库?_Java_Database_Oracle_Jpa_Enums - Fatal编程技术网

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

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

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

该实体的定义如下:

@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确实没有得到任何异常。这就是我最想知道的:(我添加了一些代码来显示我如何存储实体。然而,即使在捕获异常时,也不会抛出和捕获任何内容:(