【问题标题】:Lazy Loadng error in Console application控制台应用程序中的延迟加载错误
【发布时间】:2011-06-12 22:34:17
【问题描述】:

我有以下课程:

@Entity
@Table(name="Player")
public class Player {

    private String id;
    private Set<String> nicknames = new HashSet<String>();

        @ElementCollection(fetch=FetchType.LAZY)
    @CollectionTable(name="Nicknames", joinColumns=@JoinColumn(name="user_id"))
    @Column(name="nickname")
    public Set<String> getNicknames() {
        return nicknames;
    }
}

我的 DaoServiceImpl 是这样的:

@Repository("daoService")
public class DaoServiceImpl implements DaoService {

    @Autowired
    SessionFactory sessionFactory;

    @Override
    public String addPlayer(Player player){
        Session session = sessionFactory.getCurrentSession();
        return (String) session.save(player);
    }

    @Override
    public Player getPlayer(String id){
        Session session = sessionFactory.getCurrentSession();
        return (Player)session.load(Player.class, id);
    }

    @Override
    public void updatePlayer(Player player){
        Session session = sessionFactory.getCurrentSession();
        session.update(player);
    }
}

我的事务管理器如下所示:

<aop:config>
    <aop:pointcut id="daoServicePoint" 
            expression="execution(* com.vanilla.daoService.DaoService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="daoServicePoint"/>
  </aop:config>

  <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="add*" propagation="REQUIRED"/>
       <tx:method name="update*" propagation="REQUIRED"/>
      <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
  </tx:advice>

在我的主要功能中,我正在执行以下操作:

public void run(){
Player player = new Player();
player.addNickName("Nick1");
player.addNickName("Nick2");
player.setFirstName("Danny");
player.setLastName("Lesnik");
String playerId = daoService.addPlayer(player);
player = daoService.getPlayer(playerId);
player.addNickName("Nick4");
player.removeNickName("Nick2");
daoService.updatePlayer(player);
}

我在player.addNickName 收到以下异常

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at com.vanilla.objects.Player_$$_javassist_0.addNickName(Player_$$_javassist_0.java)
    at com.vanilla.main.Main.run(Main.java:27)
    at com.vanilla.main.Main.main(Main.java:36)

如果是 Web 应用程序,我会使用 OpenSessionIviewFilter。 我应该如何解决它 Spring Hibernate Java Console Application?

我知道我可以使用 join HQL 查询或将其设为 Eager,但出于自学目的,我想让它变得懒惰 :)

【问题讨论】:

  • 尝试 sessionFactory.getCurrentSession().getEntityManager() 并使用它来加载()。只是猜测。
  • 很遗憾,我在Session类中没有getEntityManager()这样的方法。
  • @Variant : 你能告诉我,你的代码在哪里出错,我的意思是有多个player.addNickName.??
  • @M.J 紧跟在 player = daoService.getPlayer(playerId);
  • @Variant : 也可以把代码放在你正在执行的地方 daoService.addPlayerdaoService.getPlayer(playerId); 我的意思是方法代码。

标签: java hibernate spring jakarta-ee lazy-loading


【解决方案1】:

String playerId = daoService.addPlayer(player); 在上面的代码中,您保存实体并在当前会话中关闭。之后,您尝试使用相同的会话加载播放器。但是没有打开会话。您必须在 getPlayer 方法中打开新会话,

你的代码应该改变如下

公共播放器 getPlayer(String id){ 会话会话 = sessionFactory.openSession(); 返回(播放器)session.load(播放器.class,id); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多