Witam.
W mojej aplikacji wykorzystuję Spring Data JPA wraz ze Hibernatem. Po zmianie z
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE, mappedBy = "owner")
@OrderBy("id ASC")
private Set<Unit> units;
na
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, mappedBy = "owner")
@OrderBy("id ASC")
private Set<Unit> units;
dostaję błąd could not initialize proxy - no Session
Klasa DAO:
@Repository
public interface PlayerDAO extends JpaRepository<Player, Integer>
{
@Query("select g from Player g, PlayerData gd where g.playerData = gd and gd.login = ?1")
Player findByLogin(String login);
}
Metoda z serwisu, w której powstaje błąd:
@Override
@Transactional
public DashboardViewModel getDashboardViewModel()
{
Subject subject = SecurityUtils.getSubject();
String login = (String) subject.getPrincipal();
Player player = graczDAO.findByLogin(login);
(...)
int numberOfUnits = player.getUnits().size(); <------ TU POJAWIA SIĘ BŁĄD
(...)
return viewModel;
}
Konfiguracja Springa:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/__default" />
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<tx:annotation-driven transaction-manager="transactionManager"/>
Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="IslandPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:comp/DefaultDataSource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="javax.persistence.schema-generation.database.action" value="none"/>
</properties>
</persistence-unit>
</persistence>
Jak rozwiązać ten problem bez wracania do FetchType.EAGER?