2013-05-18 1 views
0

Я разрабатываю приложение с использованием Jboss AS 7, CDI, JPA и некоторых других ресурсов.CDI + JPA Несколько @OneToMany - LAZY/EAGER - LazyInitializationException ИЛИ Невозможно создать несколько пакетов

Мой вопрос: Когда я создаю проект в Eclipse, используя Maven-JBoss-WebAPP-архетип он генерирует некоторые файлы, которые я активно изучаю и пытаюсь получить вместе с. Проблема в том, что иногда я вижу, что я немного смущен, использую ли я ресурсы Hibernate или ресурсы JPA.

Второго вопрос: Когда я использую несколько отношений @OneToMany в том же Сущностях я заметил два поведения:

а) без указания нетерпеливого типа для Fetch, развертывает приложение, но когда я пытаюсь использовать этот список дает мне так сильно объясняется ошибка LazyInitializationException.

b) Когда я указываю Eager для FetchType в отношении @ * ToMany, он просто не развертывает приложение. Это дает мне ошибку: невозможно создать несколько пакетов.

Вот проблемный фрагмент кода:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamUser" , fetch = FetchType.EAGER) 
private Collection<Users> usersCollection; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamRanking" , fetch = FetchType.LAZY) 
private Collection<Ranking> rankingCollection; 

@NotNull 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamModality" , fetch = FetchType.LAZY) 
private Collection<Modality> modalitiesCollection; 

public Teams() { 

} 

public Teams(Long id_team , String name) { 
    this.id = id_team; 
    this.name = name; 
} 

Я читал об этом, и люди говорили мне, что JPA не поддерживает FetchType.EAGER нескольких realtionships в одной и той же Сущности. Но мне нужно использовать множественные отношения в этой сущности. Я не знаю, что делать дальше, потому что я попробовал несколько подходов, ленивый выбор, и все они представляют какую-то проблему. Например, если я оставляю только один класс FetchType.EAGER в классе, он развертывает мое приложение, но он работает неправильно, потому что когда я пытаюсь получить список из базы данных, он дает мне ошибку: LazyInitializationException, а когда я попробуйте поместить все из них с помощью FetchType.EAGER, он просто не развертывается, потому что он дает ошибку: невозможно создать несколько пакетов.

Так что мои проблемы здесь связаны с:

1) Maven-JBoss-WebApp-архетип использует спящий режим или JPA, или оба? 2) Как я могу атаковать эту проблему при использовании нескольких связей @OneToMany в Entity? И хотя я знаю, что с нетерпением собираются коллекции в модели, это не лучший подход, потому что, когда система растет, у меня, вероятно, будут проблемы с производительностью? Итак, как я могу правильно работать с ленивой загрузкой?

+0

Какая реализация JPA вы используете? Hibernate? –

+0

Да, я использую hibernate в JBoss AS 7, который, я думаю, является Hibernate 4.Спасибо за ваш ответ. John – Arthur

+0

. Вы, вероятно, должны посмотреть на это SO для справки: http://stackoverflow.com/questions/10769656/how-to-use-jpa-2-0-manytomany-without-issues использует аннотации Hibernate , но может делать то, что вам нужно. –

ответ

3

Прежде всего, Hibernate - это реализация функции JPA и по умолчанию используется в JBoss. Таким образом, вы используете JPA, а Hibernate - как реализация.

Во-вторых, вы получаете исключение LazyInitialization, потому что вы получаете доступ к ленивой загрузке после закрытия сеанса без инициализации этой коллекции, пока сеанс все еще открыт. Если у вас есть две ленивых коллекций и вы знаете, что клиентский код необходим как инициализирован, инициализировать их перед возвращением сущности и закрытия сессии (то есть, пока вы еще внутри методы транзакционных услуг):

SomeEntity e = em.find(SomeEntity.class, someId); 
e.getFirstCollection().size(); // initialize the first collection 
e.getSecondCollection().size(); // initialize the second collection 
return e; 

Вы можете выбор нескольких ассоциаций toMany сразу, но только один из них может быть мешком (т. е. сборником или списком). Я бы не советовал коллективным коллекциям вообще. Но если вы действительно хотите их, сделайте их наборы вместо коллекций.

+0

JB Nizet Большое спасибо за ваше объяснение. Это делает вещи намного яснее. Можете ли вы взглянуть на один из моих методов DAO? Потому что я точно не знаю, что вы подразумеваете под методом транзакционных сервисов. Потому что я не использую метод, такой как фиксация или что-то подобное, для извлечения данных из базы данных. – Arthur

+0

[код] общественности Список retrieveAllMembersOrderedByName() { \t \t Список команды = NULL; \t \t КритерииBuilder cb = em.getCriteriaBuilder(); \t \t КритерииQuery criteria = cb.createQuery (Teams.class); \t \t Корень member = criteria.from (Teams.class); \t \t criteria.select (member) .orderBy (cb.asc (member.get (Member_.name))); \t \t criteria.select (member) .orderBy (cb.asc (member.get ("name"))); \t \t teams = em.createQuery (criteria) .getResultList(); \t \t команды возвращения; \t} – Arthur

+0

Извините. Idk, как включить коды здесь в комментарии ... – Arthur

Смежные вопросы