Java Oracle将空字符串转换为null,但JPA不';t相应地更新实体缓存

Java Oracle将空字符串转换为null,但JPA不';t相应地更新实体缓存,java,oracle,jpa,jakarta-ee,Java,Oracle,Jpa,Jakarta Ee,众所周知,Oracle将空字符串视为null 然而,我有一个问题,因为这种行为由于JPA的缓存 首先,我使用JPA(Toplink Essentials)持久化一个实体,该实体有一个空字符串作为一个字段。Oracle在存储此值时将其转换为null 然而,当我获取实体时,JPA似乎从缓存返回它,在缓存中该字段仍然是一个空字符串。JPA似乎不知道,存储到数据库中的实际上是一个空值,这种不一致性导致了问题 有没有办法在JPA或应用服务器(Oracle AS)配置级别上解决此问题?这是我不想在应用程序级

众所周知,Oracle将空字符串视为null

然而,我有一个问题,因为这种行为由于JPA的缓存

首先,我使用JPA(Toplink Essentials)持久化一个实体,该实体有一个空字符串作为一个字段。Oracle在存储此值时将其转换为null

然而,当我获取实体时,JPA似乎从缓存返回它,在缓存中该字段仍然是一个空字符串。JPA似乎不知道,存储到数据库中的实际上是一个空值,这种不一致性导致了问题


有没有办法在JPA或应用服务器(Oracle AS)配置级别上解决此问题?这是我不想在应用程序级别解决的问题(但在必要时可以解决)。

我认为问题在于Oracle没有将字符串存储为空值,而是将其存储为“未设置”值(我们称之为超级空值)。因此,如果您尝试选择空值,您将无法检索该项,因为该项未设置且不为空。您是否尝试插入空字符串而不是空字符串


我曾经有一个项目,在那里我遇到了一个类似的问题,解决方案是在数据库列中专门存储null,而不是string.empty,因为它被视为未设置且不是null…

我们已经迁移到EclipseLink,它支持@ReturnInsert和@ReturnUpdate注释。这些有助于使用实际存储到数据库中的值刷新字段。

实际上,这些值会作为null存储到数据库中。好的。。。您是否检查了结果是否为DBNull?因为java在null和dbnulls之间有区别,所以我不确定您的意思,但首先我使用字段foo(空字符串)保存一个实体。Oracle将其存储为null。然后我测试foo是否包含null值,如果不包含,则尝试将其存储到另一个不可为null的字段=>exception。我希望JPA能像在持久化时存储id一样将foo置为null。附加注释:在应用程序级别,我不知道Oracle将空字符串视为null,这就是为什么JPA在持久化值后应该替换字段。如果我将DB提供程序更改为一个可以存储空字符串的提供程序,我的代码就会工作