Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JPA обновление OneToMany коллекций


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

@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;
...
}

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

Автор: dm3q3k 14.6.2010, 08:31
может я конечно тоже туплю, но какой тогда смысл использовать JPA?
Просто organization.getDecisionList().add(decision) ничего не даст, нужно еще em.merge(organization) делать. А если у меня какой-то очень сложный объект, с большим количеством связей, мне для каждой связи делать getList().add(...)  а потом еще и merge.

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

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

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

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

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

а PersistentContext в JPAFacade типа Extended ?

Автор: dm3q3k 16.6.2010, 10:04
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>

Автор: dm3q3k 16.6.2010, 12:47
Цитата(ki6opr @ 16.6.2010,  02:56)
а PersistentContext в JPAFacade типа Extended ?

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

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

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

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

Автор: dm3q3k 18.6.2010, 07:23
Спасибо за разъяснение. А какие могут быть проблемы при использовании Extended? Ну то есть плюсы для себя я увидел, но , возможно есть какие-то подводные камни?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)