I have the following class:
@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;
}
}
My DaoServiceImpl looks like that:
@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);
}
}
My Transaction Manager looks like that:
<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>
In my main function I’m doing the following:
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);
}
I’m getting the following Exception on 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)
If it was Web Application, I would use OpenSessionIviewFilter.
How should I solve it Spring Hibernate Java Console Application?
I know that I can use join HQL query or make it Eager, but I would like to leave it lazy for self learning purposes 🙂
String playerId = daoService.addPlayer(player);
in above code you save the entity and at that current session closed. After that you try to load players using same session. But there is no open session.You have to open new session at getPlayer method,
Your code should change as bellow
public Player getPlayer(String id){
Session session = sessionFactory.openSession();
return (Player)session.load(Player.class, id);
}