Lazy Loadng ошибка в консольном приложении - PullRequest
1 голос
/ 13 июня 2011

У меня есть следующий класс:

@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)

Если бы это было веб-приложение, я бы использовал OpenSessionIviewFilter. Как мне решить это Spring Hibernate Java Console Application?

Я знаю, что могу использовать HQL-запрос join или сделать его Eager, но я бы хотел оставить его ленивым в целях самообучения

1 Ответ

0 голосов
/ 13 июня 2011

String playerId = daoService.addPlayer (player); в приведенном выше коде вы сохраняете сущность, и на этом текущий сеанс закрывается. После этого вы пытаетесь загрузить игроков, используя тот же сеанс. Но нет открытого сеанса. Вы должны открыть новый сеанс с помощью метода getPlayer,

Ваш код должен измениться как показано ниже

публичный плеер getPlayer (String id) { Session session = sessionFactory.openSession (); return (Player) session.load (Player.class, id); }

...