8

我正在尝试使用 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 类中创建一个默认值吗?

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

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

4

2 回答 2

1

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

let.setDeliveryType(null);

于 2013-09-13T05:05:37.170 回答
1

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

我看不出你怎么会一无所获,是否发生了你没有捕捉到的异常?

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

于 2012-07-11T13:49:09.033 回答