如何处理 JPA @OneToOne 映射中的 "orphaned" 行
How to cope with "orphaned" rows in JPA @OneToOne mapping
我正在尝试开发一个使用 JPA (Hibernate 4.3) 的独立 Java 应用程序。
这将访问 DB2 v10 zos 数据库。
我的两个实体有一个我想延迟加载的@OneToOne 映射。
我遇到的问题是父 table 有子 table 上不存在的行。
我正在使用
@OneToOne(optional = false, fetch = FetchType.LAZY)
这在连接列值存在于两个 table 中的情况下工作正常,但是我的数据不一致并且我的情况是值仅存在于父 table.
中
我试过添加
@NotFound(action=NotFoundAction.IGNORE)
我的@OneToOne 映射无效。
是否可以在每个 table 上并不总是一行的情况下延迟加载 @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 上不存在 ID,这将与显示的注释一起工作Table_0002.
上不存在
这是我用来获取 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();
}
here is some documentation about jpa and the optional attribute。
它说:
boolean optional
(Optional) Whether the association is optional. If set to false then a non-null relationship must always exist.
Default value:
true
Since:
JPA 1.0
将可选属性设置为 true 时会发生什么?
我正在尝试开发一个使用 JPA (Hibernate 4.3) 的独立 Java 应用程序。
这将访问 DB2 v10 zos 数据库。
我的两个实体有一个我想延迟加载的@OneToOne 映射。
我遇到的问题是父 table 有子 table 上不存在的行。
我正在使用
@OneToOne(optional = false, fetch = FetchType.LAZY)
这在连接列值存在于两个 table 中的情况下工作正常,但是我的数据不一致并且我的情况是值仅存在于父 table.
中我试过添加
@NotFound(action=NotFoundAction.IGNORE)
我的@OneToOne 映射无效。
是否可以在每个 table 上并不总是一行的情况下延迟加载 @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 上不存在 ID,这将与显示的注释一起工作Table_0002.
上不存在这是我用来获取 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();
}
here is some documentation about jpa and the optional attribute。 它说:
boolean optional (Optional) Whether the association is optional. If set to false then a non-null relationship must always exist. Default value: true Since: JPA 1.0
将可选属性设置为 true 时会发生什么?