プロジェクトのライブラリを更新しようとしています (Hibernate 3.2.1 GA から Hibernate 4.2.8 へ)
この (複雑な) アプリケーションは、LAZY ローディングを使用し、後で必要なときにのみオブジェクトを取得します。--> org.hibernate.LazyInitializationException : could not initialize proxy - no Session が発生したため、動作が異なるようです
@Entity
@Table(name = "CLIENTS")
public class Clients {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INFOIDT", insertable = true, updatable = false)
private Information info;
//...
}
製品を使用する前に製品について詳しく知る必要がある場合:
cli.getInfo();
私の persistence.xml では、プロパティ hibernate.cache.provider_class が org.hibernate.cache.EhCacheProvider に設定されており、2 番目のレベルのキャッシュになっていることに注意してください。
質問 :既存のコードを Hibernate4 に移行する簡単な方法は何ですか? (上記の例のクラスは、LAZY ローディングを使用した多くのケースを説明するための偽の例です) ありがとうございます。
要求に応じて、以下の私の DAO を参照してください。
public class MyAppJpaDAO extends GenericJpaDAO implements IMyAppDAO {
protected static Log log = LogFactory.getLog(MyAppJpaDAO.class);
// Entity Manager of the project
@PersistenceContext(unitName = "MyApp.hibernate")
private EntityManager em;
public News readLastNews() {
StringBuffer sql = new StringBuffer("");
sql.append(" select object(n) ");
sql.append(" from News n ");
sql.append(" Where n.flagLastStatus = 'V' ");
sql.append(" order by n.pk.date desc ");
Query aQuery = em.createQuery(sql.toString());
List<News> res = (List<News>) aQuery.getResultList();
if (res != null && res.size() != 0) {
return res.get(0);
}
return null;
}
//...
}
/////////////
public class GenericJpaDAO implements IGenericDAO {
protected static Log log = LogFactory.getLog(GenericJpaDAO.class);
@PersistenceContext(unitName = "MyApp.hibernate")
EntityManager em;
public Object getReference(Class _class, Object _object) {
return em.getReference(_class, _object);
}
public void createObject(Object object) {
try {
em.persist(object);
} catch (LazyInitializationException lie) {
em.merge(em.merge(object));
}
}
public void deleteObject(Object object) {
try {
em.remove(object);
} catch (Exception e) {
em.remove(em.merge(object));
}
}
public void updateObject(Object object) {
em.merge(em.merge(object));
}
//...
}