第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復(fù)Java中的LazyInitializationException?

如何修復(fù)Java中的LazyInitializationException?

猛跑小豬 2022-09-07 16:05:06
我從事一個小項目,我有2個表,用戶和應(yīng)用程序。一個用戶可以有多個應(yīng)用程序,一個應(yīng)用程序可能由多個用戶使用,因此它們是它們之間的多對多關(guān)系。每個表都有一些字段(id,名稱,密碼,技術(shù)等),我還在User和Apprause類中聲明了2個數(shù)組列表,并帶有@ManyToMany的注釋。問題是,在我的業(yè)務(wù)層中,我寫了一個方法,應(yīng)該向用戶添加一個應(yīng)用程序,當(dāng)我嘗試做user.getListOfApplications().add(app)時,它會給我這個例外...公共類管理器Hibernate { private SessionFactory sessionFactory;public void setup(){     sessionFactory = new Configuration().configure().buildSessionFactory();}public void exit(){    sessionFactory.close();}public void create(Object obj){    Session session = sessionFactory.openSession();    session.beginTransaction();    session.save(obj);    session.getTransaction().commit();    session.close();}public Object read(Class<?> c, int idObj){    Session session = sessionFactory.openSession();    session.beginTransaction();    Object obj = session.get(c, idObj);    System.out.println(obj);    session.getTransaction().commit();    session.close();    return obj;}public void update(Object obj){    Session session = sessionFactory.openSession();    session.beginTransaction();    session.update(obj);    session.getTransaction().commit();    session.close();}public void delete(Object obj){    Session session = sessionFactory.openSession();    session.beginTransaction();    session.delete(obj);    session.getTransaction().commit();    session.close();}public <T> List<T> loadAllData(Class<T> type){    Session session = sessionFactory.openSession();    session.beginTransaction();    CriteriaBuilder builder = session.getCriteriaBuilder();    CriteriaQuery<T> criteria = builder.createQuery(type);    criteria.from(type);    List<T> data = session.createQuery(criteria).getResultList();    session.getTransaction().commit();    session.close();    return data;}}
查看完整描述

2 回答

?
慕仙森

TA貢獻(xiàn)1827條經(jīng)驗 獲得超8個贊

當(dāng)您使用以下方法管理器加載數(shù)據(jù)時,問題開始。


public <T> List<T> loadAllData(Class<T> type)

{

        // New session was opened here

        Session session = sessionFactory.openSession();

        session.beginTransaction();


        CriteriaBuilder builder = session.getCriteriaBuilder();

        CriteriaQuery<T> criteria = builder.createQuery(type);

        criteria.from(type);

        List<T> data = session.createQuery(criteria).getResultList();


        session.getTransaction().commit();

        session.close();

        //session is close here

        return data;

    }

因此,當(dāng)您加載數(shù)據(jù)時,休眠框架將僅加載用戶對象。由于您已選擇在模型類中使用延遲加載,因此只有在您嘗試訪問列表時才會加載應(yīng)用程序值。由于您已經(jīng)關(guān)閉了會話,因此框架無法再獲取應(yīng)用程序列表,從而導(dǎo)致延遲加載異常。


listOfApplications = managerHibernate.loadAllData(Application.class);

//loading user data and close the session associated with it

listOfUsers = managerHibernate.loadAllData(User.class);

User user = null;

Application app = null;


for(Application index: listOfApplications)

{

  if(index.getApplicationName().equals(applicationName))

      {

          okApp = 1;

          app = index;

      }

}


for(User index: listOfUsers)

{

  if(index.getUserUserName().equals(userUserName))

      {

          okUser = 1;

          user = index;

      }

}


if(okUser == 0  || okApp == 0)

  return false;

else

{   

  // when you run this line the hibernate framework will try to retrieve the application data.Since you have the closed session lazy load exception occurs 

  user.getListOfApplications().add(app);

  return true;

}

解決此問題的方法


1)嘗試保持會話打開狀態(tài),以便您的框架可以獲取應(yīng)用程序數(shù)據(jù)


2)在模型pojo類中將延遲加載更改為預(yù)先加載(因為您正在使用多對多關(guān)系,因此不建議以這種方式使用)


查看完整回答
反對 回復(fù) 2022-09-07
?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊

由于沒有用于獲取用戶中應(yīng)用程序的惰性列表的事務(wù),因此您需要先獲取它。為了做到這一點,你可以改變loadAllData,如下所示:


public interface CriteriaSpec 

{

public void joinFetch(CriteriaBuilder builder, CriteriaQuery criteria, Root root);

}


public <T> List<T> loadAllData(Class<T> type, Optional<CriteriaSpec> spec)

{

Session session = sessionFactory.openSession();

session.beginTransaction();


CriteriaBuilder builder = session.getCriteriaBuilder();

CriteriaQuery<T> criteria = builder.createQuery(type);

Root root = criteria.from(type);

if(spec.isPresent())

    spec.joinFetch(builder, criteria, root);

List<T> data = session.createQuery(criteria).getResultList();


session.getTransaction().commit();

session.close();

return data;

}

然后使用它:


managerHibernate.loadAllData(Application.class, Optional.empty());

listOfUsers = managerHibernate.loadAllData(User.class, (rootEntity, query, 

criteriaBuilder) -> {

            rootEntity.fetch("listOfApplications", JoinType.Left_OUTER_JOIN);


        });


查看完整回答
反對 回復(fù) 2022-09-07
  • 2 回答
  • 0 關(guān)注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號