Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JPA обновление OneToMany коллекций, Данные в базу сохраняются, но коллекция  
:(
    Опции темы
dm3q3k
Дата 12.6.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.6.2010

Репутация: нет
Всего: нет



Здравствуйте! Прошу помочь разобраться
Имеется следующий код
Код

@ManagedBean(name = "createDecision")
@SessionScoped
public class CreateDecision implements Serializable {
    @EJB
    JpaFacade jpa;
    private Decision decision;
    private Organization organization;

    public void addDecision() {
        decision.setOrganization(organization);
        jpa.create(decision);
        }
}

Данные (decision) успешно сохраняются в базу. Но если где-то далее по коду  взять объект Organization и посмотреть связанную с ним коллекцию Decision, то получаю старый список, без добавленных новых объектов.

Получение объекта  Organization и просмотр списка Decision
Код

        Organization o = (Organization) jpa.findById(Organization.class, 479);
        for(Decision d : o.getDecisionList()){
            System.out.println(d);
        }


Класс Organization
Код

@Entity
@Table(name = "organization")
public class Organization implements Serializable {
...
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "organization")
    private List<Decision> decisionList;
...
}


Класс Decision
Код

@Entity
@Table(name = "decision")
public class Decision implements Serializable {
...
    @JoinColumn(name = "organization", referencedColumnName = "id", nullable = false)
    @ManyToOne(optional = false)
    private Organization organization;
...
}

PM MAIL   Вверх
ki6opr
Дата 14.6.2010, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



может я конечно туплю, но разве не нужно сделать еще и вот так ?
organization.getDecisionList.add(decision)

PM MAIL ICQ   Вверх
dm3q3k
Дата 14.6.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.6.2010

Репутация: нет
Всего: нет



может я конечно тоже туплю, но какой тогда смысл использовать JPA?
Просто organization.getDecisionList().add(decision) ничего не даст, нужно еще em.merge(organization) делать. А если у меня какой-то очень сложный объект, с большим количеством связей, мне для каждой связи делать getList().add(...)  а потом еще и merge.
PM MAIL   Вверх
ki6opr
Дата 15.6.2010, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



только сейчас заметил а где Каскадность у Decision.organization ? по умолчанию вообще то никаких действий производится не будет

Это сообщение отредактировал(а) ki6opr - 15.6.2010, 07:24
PM MAIL ICQ   Вверх
dm3q3k
Дата 15.6.2010, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.6.2010

Репутация: нет
Всего: нет



Цитата(ki6opr @ 15.6.2010,  07:23)
только сейчас заметил а где Каскадность у Decision.organization ? по умолчанию вообще то никаких действий производится не будет

 а какая каскадность должна быть. Ставил CascadeType.ALL, так он мне новую организацию создает, а не обновляет коллекцию у старой
PM MAIL   Вверх
ki6opr
Дата 16.6.2010, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



Цитата(dm3q3k @ 15.6.2010,  09:26)
Цитата(ki6opr @ 15.6.2010,  07:23)
только сейчас заметил а где Каскадность у Decision.organization ? по умолчанию вообще то никаких действий производится не будет

 а какая каскадность должна быть. Ставил CascadeType.ALL, так он мне новую организацию создает, а не обновляет коллекцию у старой

а PersistentContext в JPAFacade типа Extended ?
PM MAIL ICQ   Вверх
dm3q3k
Дата 16.6.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.6.2010

Репутация: нет
Всего: нет



JpaFacade, type не указан, видимо по умолчанию
Код

@Stateless(name = "JpaFacade")
public class JpaFacade implements Serializable {

    @PersistenceContext(unitName = "PortalPU")
    private EntityManager em;


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="PortalPU" transaction-type="JTA">
    <jta-data-source>jdbc/sro_db</jta-data-source>
    <properties/>
  </persistence-unit>
</persistence>

PM MAIL   Вверх
dm3q3k
Дата 16.6.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.6.2010

Репутация: нет
Всего: нет



Цитата(ki6opr @ 16.6.2010,  02:56)
а PersistentContext в JPAFacade типа Extended ?

а что даст тип Extended? Если не затруднит, поясните пожалуйста

Это сообщение отредактировал(а) dm3q3k - 16.6.2010, 12:47
PM MAIL   Вверх
ki6opr
Дата 17.6.2010, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



да тут нужно тип Extended использовать, различие в том что если используешь PersistentContext.Extended сущности всегда находятся в контексте пока ты сам вручную не сделаешь detach (тоесть JPA знает новая ли это сущность, либо она измененая).
в случае обычного контекста у тебя сущность приходит в состоянии detached и сначала нужно сделать merge который изменит состояние либо на new для новой либо на merged для существующей энтити.

собственно в джавадоках это все описано smile

у тебя получается что сушности приходят detached потом ты делаешь персист и машина просто создает новые вместо того что бы обновить Organization.
измени тип контекста на Extended и добавь в анотацию ManyToOne каскадность.

Это сообщение отредактировал(а) ki6opr - 17.6.2010, 02:29
PM MAIL ICQ   Вверх
dm3q3k
Дата 18.6.2010, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.6.2010

Репутация: нет
Всего: нет



Спасибо за разъяснение. А какие могут быть проблемы при использовании Extended? Ну то есть плюсы для себя я увидел, но , возможно есть какие-то подводные камни?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1070 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.