简体   繁体   中英

Hibernate TransactionException when Saving to Database

I am having issues with hibernate when trying to save to a database. i have the following two classes:: A normal class and a test class::

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;
    }


}

This is the test class ::

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);
    }

}

Am having the following exception ::

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)

...
...

The error is coming from the tx.commit(); in the public void addRanking(...); method because if i comment it out, it runs fine with no exceptions but then the data is not saved to the database.

I begin and commit the transaction in the same public void addRanking(...); method but i don't understand why am getting the Transaction exception.

What am i doing wrong?

thanks

The objects like Person , Skill and Ranking are normal Java POJOs containing only getters and setters.

I think in the addRanking(..) method, after the Transaction tx = session.getTransaction(); you missed to call

tx.begin()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM