Merci pour votre réponse.
Mon code est:
DAO:Code:
public class ArtistDAOBase implements DaoElement
{
private Transaction tx;
private final SessionFactory sessionFactory = getSessionFactory();
public SessionFactory getSessionFactory()
{
logInfo.info("[Class Artist] | getSessionFactory() : Getting new session factory");
try
{
Configuration configuration = new Configuration();
configuration.configure().setProperty("hibernate.show_sql", "false");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
logDebug.debug("[Class Artist] | getSessionFactory() : New session factory created successfully");
return (configuration.buildSessionFactory(serviceRegistry));
}
catch (Exception e)
{
logError.error("[Class Artist] | getSessionFactory() : Could not locate SessionFactory in JNDI", e);
throw new IllegalStateException("Could not locate SessionFactory in JNDI");
}
}
protected void startOperation()
{
tx = sessionFactory.getCurrentSession().beginTransaction();
logDebug.debug("[Class Artist] | startOperation() : New transaction started from current session.");
}
/**
* Ends a transaction
*/
public void endOperation()
{
tx.commit();
logDebug.debug("[Class Artist] | endOperation() : Transaction commited, session ended.");
}
public List<Artist> findAll(int maxResults, int firstRow)
{
logInfo.info("[Class Artist] | findAll(int maxResults, int firstRow) : Getting all Artist instances");
try
{
startOperation();
Query query = sessionFactory.getCurrentSession().createQuery("from " + "Artist");
query.setMaxResults(maxResults);
query.setFirstResult(firstRow);
List<Artist> ret = (List<Artist>)query.list();
endOperation();
logDebug.debug("[Class Artist] | findAll(int maxResults, int firstRow) : Get all Artist instances success");
return ret;
}
catch (RuntimeException re)
{
logError.error("[Class Artist] | findAll(int maxResults, int firstRow) : Get all Artist instances exception failure", re);
throw re;
}
}
}
Bean Artist:Code:
import java.util.HashSet;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonElement;
public class Artist implements java.io.Serializable, DboBean
{
private Long id;
private String name;
private Set<Item> items = new HashSet<Item>(0);
public Artist() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Set<Item> getItems() {
return this.items;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
Un artist peut être asocié avec plusieurs items, c'est pour ça que le bean a un attribute items de type set.
Bean Item:Code:
public class Item implements java.io.Serializable, DboBean
{
private Long id;
private Artist artist;
private int kind;
private String name;
public Item() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public Artist getArtist() {
return this.artist;
}
public void setArtist(Artist artist) {
this.artist = artist;
}
public int getKind() {
return this.kind;
}
public void setKind(int kind) {
this.kind = kind;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Le problème consiste en que quand j`intente obtenir les items d`un artist la session s`a fermé parce que dans mon DAO je fais un endoperation() et ça signifie un tx.commit et, après la session ne existe plus et je obtiens un lazy initialization error. J'ai généré tout ce code avec Hibernate Tools et je ne suis pas sûr s`il est correct. Peut-je laisser la session ouverte pour assurer que après je pourrais obtenir les collections? Ou c`est nécessaire de faire toujours un opensession ou getcurrentsession et après un tx.commit()? Où et quand dois-je fermer la session?
Merci beaucoup.
Merci pour votre aide.