進一步說進入休眠我已經在下列情況下跌跌撞撞: 我有一個@Entity人@Entity中的@Transactional不起作用?
@Entity
@Table(name = "PERSON")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="person")
public class Person implements PersonInterface{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USER_ID")
protected Integer id;
@Column(name = "NAME")
protected String name;
@ElementCollection
@Formula("(SELECT groupId FROM PERSON_GROUPS WHERE id = id")
protected List<Integer> groups = new ArrayList<>();
@Override
public Integer getId() {
return id;
}
@Override
public Collection<Integer> getGroups(){
return groups;
}
@Override
public String getName() {
return name;
}
}
這是兩個部分,可變和不可變分裂:
@Entity
@DiscriminatorValue("mutableperson")
@Transactional
public class MutablePerson extends Person implements MutablePersonInterface{
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setId(Integer id) {
this.id = id;
}
@Override
public void setGroups(List<Integer> groupIds) {
this.groups = groupIds;
}
public void excludeFromGroup(Integer groupId){
Hibernate.initialize(this.groups);
this.groups.remove(groupId);
}
}
現在,當我嘗試調用類似:
Session session = sessionFactory.openSession();
MutablePerson personFromDb = (MutablePerson) personService.getMutablePersonById(0);
personFromDb.excludeFromGroup(group1.getId());
session.saveOrUpdate(personFromDb);
我得到一個異常:
Exception in thread "main" org.hibernate.HibernateException: collection is not associated with any session
at org.hibernate.collection.internal.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:704)
at org.hibernate.Hibernate.initialize(Hibernate.java:65)
at com.studytrails.tutorials.springhibernatejpa.MutablePerson.excludeFromGroup(MutablePerson.java:57)
at com.studytrails.tutorials.springhibernatejpa.TestSpringHibernateJpa.main(TestSpringHibernateJpa.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
這告訴我,那個MutablePerson
類的@Transactional註釋實際上並不工作,而Hibernate沒有創建一個事務。
這裏的這一位我的Spring配置:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
至於我可以從Hibernate的文檔和例子說,這個配置是正確的,它應該工作,但事實並非如此。我在這裏想念另一個Hibernate的細微差別嗎?
P.S.我知道我可以在DAO或Service類中做到這一點,但不幸的是我必須使用現有的API,它與實體的可變半部分中的組一起工作。
請加上'personService.getMutablePersonById'方法的問題代碼。 –
您必須重新考慮設計,它不是一個在實體級別具有事務性的良好實踐,它應該位於業務級別或由spring管理的最大存儲庫級別。 這裏您註釋了實體級別的Transactional以及哪些實體生命週期不會由Spring管理。所以它必然會失敗。 給你一個設計思路,看看你如何適應乾淨 –
@RohanSRaju好的,thx,如果沒有辦法讓它工作,重新設計是不可避免的。 –