如何处理 JPA @OneToOne 映射中的“孤立”行

Posted

技术标签:

【中文标题】如何处理 JPA @OneToOne 映射中的“孤立”行【英文标题】:How to cope with "orphaned" rows in JPA @OneToOne mapping 【发布时间】:2015-01-19 09:36:32 【问题描述】:

我正在尝试开发一个使用 JPA (Hibernate 4.3) 的独立 Java 应用程序。

这将访问一个 DB2 v10 zos 数据库。

我的两个实体有一个我想延迟加载的 @OneToOne 映射。

我遇到的问题是父表中有子表上不存在的行。

我正在使用

@OneToOne(optional = false, fetch = FetchType.LAZY)

在两个表中都存在连接列值的情况下效果很好,但是我的数据不一致并且我的值仅存在于父表中。

我已经尝试添加

@NotFound(action=NotFoundAction.IGNORE)

到我的@OneToOne 映射无济于事。

是否可以延迟加载@OneToOne 关系,其中每个表上不总是有一行?

我的两个实体具有 OneToOne 映射的这些注释

@Entity
@Table(name = "TABLE0001")
@BatchSize(size = 100)
public class Table_0001 

    /**
     * Related Table
     */
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "PTY_ID")
    @BatchSize(size = 100)
    private Table_0002 table0002;

    public Table_0002 getTable0002() 
        return table0002;
    

    public void setTable0002(final Table_0002 table0002) 
        this.table0002 = table0002;
    



@Entity
@Table(name = "TABLE0002")
@BatchSize(size = 100)
public class Table_0002 


我需要在这两个实体之间进行延迟加载。

我正在检索 Table_0001 的列表,然后希望以 100 个为一组获取 Table_0002。如果 Table_0001 上不存在但 Table_0002 上不存在的 ID,则所有这些都适用于显示的注释。

这是我用来获取 Table_0001 列表的 java 代码

private static Collection<? extends Table_0001> getAllModelsIterable(final String filter, final int offset, final int max) 

    final CriteriaBuilder criteriaBuilder = PersistenceManager.INSTANCE.getCriteriaBuilder();

    final CriteriaQuery<Table_0001> criteriaQuery = criteriaBuilder.createQuery(Table_0001.class);
    Root<Table_0001> personRoot = criteriaQuery.from(Table_0001.class);
    criteriaQuery.select(personRoot);
    criteriaQuery.where(criteriaBuilder.like(personRoot.get(Table_0001_.filter), filter));
    criteriaQuery.orderBy(criteriaBuilder.asc(personRoot.get("id")));

    final TypedQuery<Table_0001> typedQuery = entityManager.createQuery(criteriaQuery);
    typedQuery.setFirstResult(offset);
    typedQuery.setMaxResults(max);

    return typedQuery.getResultList();


【问题讨论】:

您是如何查询数据的? 【参考方案1】:

here is some documentation about jpa and the optional attribute。 它说:

布尔可选 (可选)关联是否可选。如果设置为 false,则必须始终存在非空关系。 默认值: 真的 自从: JPA 1.0

将 optional 属性设置为 true 时会发生什么?

【讨论】:

由于我需要延迟加载此 OneToOne 映射,我使用可选的 false,这会导致行仅存在于其中一个表上的异常。当我将 optional 设置为 true 时,我没有收到异常,但是我也没有得到 LAZY 加载

以上是关于如何处理 JPA @OneToOne 映射中的“孤立”行的主要内容,如果未能解决你的问题,请参考以下文章

jpa:更新新父实体的关系

JPA 2.0 如何处理死锁(Eclipselink JPA2.0 MySQL)

如何处理锁(JPA)?

如何处理来自catch块的spring jpa @transactional和新插入[重复]

JPA 是不是支持映射到 sql 视图?

Hibernate 注解