如何使用JPA解决javax.persistence.EntityNotFoundException(而不是使用@NotFound)

Ale*_*lex 15 java persistence hibernate jpa

我们正在使用JPA从数据库加载一些东西.一些实体可能在它们之间具有可选关系,例如

@Entity
public class First {
    ....
    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
    @JoinColumns(value = {
        JoinColumn(name = "A_ID", referencedColumnName = "A_ID", insertable = false, updatable = false), 
        JoinColumn(name = "B_ID", referencedColumnName = "B_ID", insertable = false, updatable = false)})
    private Second second;
Run Code Online (Sandbox Code Playgroud)

当数据库中存在此关联时,一切正常.当它不是时,我得到一个javax.persistence.EntityNotFoundException
我想要的而不是异常,如果该关联不存在,则将该字段设为NULL.

我尝试了好几种不同的东西,例如,使用可选=真正的关系注释(顺便说一句这是默认选项),把它作为可空,等似乎没有这样的伎俩,好像被忽略了所有这些选项.

我发现很多链接提到了这个相同的问题(以及stackoverflow中的一些问题),但是在所有这些问题中,建议是使用@NotFoundHibernate中的注释.但是我们不想对Hibernate有任何依赖(我们希望保持所有纯粹的JPA).

你们中的任何人都知道解决这个问题吗?

非常感谢你的帮助!

Bjö*_*örn 7

以下是此问题的替代解决方案.我不得不建立在一个旧数据库的基础上,这个数据库的关系有时会被破坏.这就是我只使用JPA解决它的方法.

@PostLoad
public void postLoad(){
    try {
        if(getObject() != null && getObject().getId() == 0){
            setObject(null);
        }
    }
    catch (EntityNotFoundException e){
        setObject(null);
    }
} 
Run Code Online (Sandbox Code Playgroud)


小智 0

在对应的实体类中添加一个测试怎么样:

public boolean getHasSecond() {
    if (this.Second != null) {
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样,您可以检查关系是否存在......

  • 这不可能。`second` 永远不会为空,这就是问题所在。JPA 尝试从数据库加载它,如果没有找到,那么它会抛出异常......所以这个方法永远不会执行!此外,如果您实际上没有尝试从数据库加载某些内容,如何检查它是否存在? (2认同)