簡體   English   中英

我不明白為什么Hibernate創建2個會話?

[英]I don't understand why Hibernate is creating 2 sessions?

我已經撓了一段時間,以為我會得到一些幫助的。

我正在使用無法更改的舊數據庫。 我有以下域名:

@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); 只是委托給擴展了HibernateDaoSupport的DAO。

...我收到以下錯誤:

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 ,但我不知道為什么要創建第二個會話?

您的關聯存在問題,

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

是您的institutionSubscription設置的insertable=false, updatable=false 您需要刪除它,或者在新訂閱的集合下面創建一個新屬性。

private Long institutionId;

並替換subscription.setInstitution(institution); 這個,

subscription.setInstitutionId(institution.getId());

在此處閱讀有關insertable=false, updatable=false映射的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM