2017-07-20 13 views
0

我使用Hibernate和具有以下设置:我是否需要在Hibernate中显式启动和结束事务?

@Entity 
public class Owner { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name = "name", nullable = false) 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL) 
private List<Dog> dogs = new ArrayList<>(); 
} 

@Entity 
public class Dog { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name = "name", nullable = false) 
    private String name; 
} 


public class PersonDao { 

public Long createPetRelation(String ownerName, String dogName) { 

    EntityManager entityManager = entityManagerFactory.createEntityManager(); 

    Dog dog = new Dog(); 
    dog.setName("Fido"); 
    Person person = new Person(); 
    person.setName("Joe"); 
    person.addDog(dog); 
    entityManager.persist(person); 

    return person.getId(); 
    } 
} 

我不知道我是否需要包装的持久性代码在一个事务中,还是休眠可以根据@OneToMany关系弄清楚,如果保存狗实体失败,那么整个事情应该回滚?从文档中不清楚。

我没有使用容器或框架,只是在具有JPA配置的独立Java项目中直接使用Hibernate。

回答

0

是的,你需要将代码包装在交易中。像Hibernate实现的JPA一样,当您运行修改数据库的操作时,它不会自动创建事务。但是,如果使用EJB这样的java spefication,则不需要显式创建事务,因为默认情况下,所有ejb方法都是事务性的。如果你使用像Spring这样的框架,你可以简单地使你的方法成为事务性的。

相关问题