[英]Hibernate TransactionException: nested transactions not supported
[英]Hibernate TransactionException when Saving to Database
嘗試保存到數據庫時,我遇到了休眠問題。 我有以下兩個類::一個普通類和一個測試類::
public class HibernateRankingService2 implements RankingService2{
public HibernateRankingService2() {
}
public void addRanking(String subject, String observer, String skill, int ranking) {
Session session = HibernateUtil.getSession();
Transaction tx = session.getTransaction();
addRanking(session, subject, observer, skill, ranking);
tx.commit();
session.close();
}
private void addRanking(Session session, String subjectName,
String observerName, String skillName, int rank) {
Person subject = savePerson(session, subjectName);
Person observer = savePerson(session, observerName);
Skill skill = saveSkill(session, skillName);
Ranking ranking = new Ranking();
ranking.setSubject(subject);
ranking.setObserver(observer);
ranking.setSkill(skill);
ranking.setRanking(rank);
session.save(ranking);
}
public int getRankingFor(String subject, String skill) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
int average = getRankingFor(session, subject, skill);
tx.commit();
session.close();
return average;
}
private int getRankingFor(Session session, String subject,
String skill) {
Query query = session.createQuery("from Ranking r "
+ "where r.subject.name=:name "
+ "and r.skill.name=:skill");
query.setString("name", subject);
query.setString("skill", skill);
int sum = 0;
int count = 0;
for (Ranking r : (List<Ranking>) query.list()) {
count++;
sum += r.getRanking();
System.out.println(r);
}
return count == 0 ? 0 : sum / count;
}
private Person findPerson(Session session, String name){
Query query = session.createQuery("from Person p where p.name=:name");
query.setParameter("name", name);
query.setMaxResults(1);
List<Person> person = (List<Person>)query.list();
System.out.println("SIZE..: " + query.list().size());
if(person.size() == 0){
return null;
}
return person.get(0);
}
private Person savePerson(Session session, String name){
Person person = findPerson(session, name);
if(person == null){
person = new Person();
person.setName(name);
session.save(person);
}
return person;
}
private Skill findSkill(Session session, String name){
Query query = session.createQuery("from Skill s where s.name=:name");
query.setParameter("name", name);
query.setMaxResults(1);
List<Skill> skill = (List<Skill>)query.list();
System.out.println("SIZE..: " + query.list().size());
if(skill.size() == 0){
return null;
}
return skill.get(0);
}
private Skill saveSkill(Session session, String name){
Skill skill = findSkill(session, name);
if(skill == null){
skill = new Skill();
skill.setName(name);
session.save(skill);
}
return skill;
}
}
這是測試類::
public class AddRankingTest {
RankingService2 service = new HibernateRankingService2();
@Test
public void addRanking(){
service.addRanking("J. C. Smell", "Drew Lombardo", "Mule", 8);
assertEquals(service.getRankingFor("J. C. Smell", "Mule"), 8);
}
}
我有以下異常::
org.hibernate.TransactionException: Transaction not successfully started
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:59)
at chapter3.application.HibernateRankingService2.addRanking(HibernateRankingService2.java:29)
at chapter3.simple_test.AddRankingTest.addRanking(AddRankingTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
...
...
錯誤來自tx.commit();
在public void addRanking(...);
方法,因為如果我將其注釋掉,它運行良好,沒有例外,但數據不會保存到數據庫中。
我在同一個public void addRanking(...);
開始並提交事務public void addRanking(...);
方法,但我不明白為什么會收到交易異常。
我究竟做錯了什么?
謝謝
像Person
、 Skill
和Ranking
這樣的對象是只包含 getter 和 setter 的普通 Java POJO。
我認為在addRanking(..)
方法中,在Transaction tx = session.getTransaction();
你錯過了電話
tx.begin()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.