我是否需要在Hibernate中显式启动和结束事务?

时间:2017-07-20 22:47:18

标签: java hibernate jpa

我正在使用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();
  }
}

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

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

1 个答案:

答案 0 :(得分:0)

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