簡體   English   中英

保存到數據庫時休眠事務異常

[英]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(...); 方法,但我不明白為什么會收到交易異常。

我究竟做錯了什么?

謝謝

PersonSkillRanking這樣的對象是只包含 getter 和 setter 的普通 Java POJO。

我認為在addRanking(..)方法中,在Transaction tx = session.getTransaction(); 你錯過了電話

tx.begin()

暫無
暫無

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

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