Я немного почесал голову и подумал, что мне нужна помощь:)
Я работаю с устаревшей базой данных, которую я не могу изменить.У меня есть следующий домен:
@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 и не могу понять, почему создается второй сеанс?