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

时间:2015-01-19 09:36:33

标签: java hibernate hibernate-mapping jpa-2.1

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

这将访问DB2 v10 zos数据库。

我的两个实体都有一个@OneToOne映射,我想要LAZY加载。

我遇到的问题是Parent表中包含子表上不存在的行。

我正在使用

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

在两个表中都存在连接列值的情况下工作正常,但是我的数据不一致,而且我的情况是值只存在于父表中。

我尝试过添加

@NotFound(action=NotFoundAction.IGNORE)

我的@OneToOne映射无效。

LAZY LOAD @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 {

}

我需要在这两个实体之间加载LAZY。

我正在检索Table_0001的列表,然后想要以100的批量获取Table_0002。如果Table_0001上存在ID不存在于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 个答案:

答案 0 :(得分:1)

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

  

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

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