Я не понимаю, почему Hibernate создает 2 сессии? - PullRequest
0 голосов
/ 07 марта 2012

Я немного почесал голову и подумал, что мне нужна помощь:)

Я работаю с устаревшей базой данных, которую я не могу изменить.У меня есть следующий домен:

@Entity
public class Institution {
    @Id
    private Long id;

    @OneToMany(mappedBy="institution", fetch=FetchType.EAGER)
    private List<Subscription> subscriptions = new ArrayList<Subscription>();
}

@Entity
public class Subscription {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="sub_id", referencedColumnName="ins_sub_id", insertable=false, updatable=false)
    private Institution institution;
}

Ради краткости я исключил показ геттеров / сеттеров.Таблица соединений отсутствует.

Итак;

1) Правильно ли сопоставлено?Я хочу, чтобы двунаправленная ассоциация и Учреждение являлись владельцем отношений.

2) Если я загружаю Учреждение, создайте new Subscription() и добавьте подписку в коллекцию subscriptions ...

@RequestMapping(value="/add/{institutionId}", method=RequestMethod.POST)
public String submitSubscriptionForm(@ModelAttribute SubscriptionForm form) {

    Institution institution = institutionService.getById(form.getInstitutionId());
    Subscription subscription = new Subscription();
    //...set properties on subscripton from data in the form
    subscription.setInstitution(institution);
    institution.getSubscriptions().add(subscription);
    institutionService.saveOrUpdateInstitution(institution);
}

... когда я сохраняю Учреждение ...

institutionService.saveOrUpdateInstitution(institution); просто делегирует DAO, который расширяет HibernateDaoSupport.

... Я получаюследующая ошибка:

org.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a collection with two open sessions; nested exception is org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:737)
at com.f1000.dao.hibernate.InstitutionDaoImpl.saveOrUpdate(InstitutionDaoImpl.java:161)

Я использую Spring и использую OpenSessionInViewFilter и не могу понять, почему создается второй сеанс?

1 Ответ

1 голос
/ 08 марта 2012

В вашей ассоциации есть проблема,

    @ManyToOne
    @JoinColumn(name="sub_id", referencedColumnName="ins_sub_id")
    private Institution institution;

Это insertable=false, updatable=false установленный на вашем institution внутри Subscription.Либо вам необходимо удалить его, либо создать новое свойство, как указано ниже, для новых подписок.

private Long institutionId;

и заменить subscription.setInstitution(institution); на

subscription.setInstitutionId(institution.getId());

Читать здесь подробнее о insertable=false, updatable=false отображениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...