Person というエンティティを作成しました。Lifecycle インターフェイスを実装します。onLoad メソッドは、部門のプロパティを設定します。部門が不明な場合があります (== null)。
@Entity
@Table(name = "PERSON")
public class Person implements Lifecycle {
@Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
String name;
@Transient
Department department;
public void onLoad(Session s, Serializable id) {
// some logic resolving department
}
}
部門のプロパティを仮想列 (またはこのようなもの) にする方法はありますか?データベースには作成されません。
@Entity
@Table(name = "PERSON")
public class Person {
@Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
String name;
@Type(type = "DepartmentType") // UserType for resolving a department
//@Transcient
//@Column(insertable = false, updatable = false)
//@NotFound(action = NotFoundAction.IGNORE)
// ... don't have a clue
Department department;
}
基準を使用できるようにしたいと考えています。
Criteria criteria = session.createCriteria(Person.class);
criteria.add(Restrictions.isNotNull("department"));
List<Person> list = criteria.list();
Criteria は部門を見つける前に実行されるため、プロパティ「部門」を解決できませんでした。
UserType の nullSafeGet から行を削除できることがわかりました
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
rs.deleteRow();
}
しかし、データベースから行を削除したくありません (読み取り専用です!)。
私の質問を要約すると:
1) 仮想列を作成することは可能ですか?
2) これを行うより効率的な方法はありますか?
Criteria criteria = session.createCriteria(Person.class);
// ... some restrictions ...
List<Person> list = criteria.list();
Iterator<EbamLogMessageEntity> it = list.iterator();
while(it.hasNext()) {
Person p = it.next();
Department d = resolveDepartment(p)
if(d == null) {
it.remove();
} else {
p.setDepartment(d);
}
}