Hibernate为每个OneToMany连接创建新记录

时间:2013-06-07 14:40:42

标签: java database hibernate orm mapping

我是一个hibernate和EJB Beginner。我有这个简单的ORM:

USER - > belongsTo - > GROUP

我习惯用其他语言创建以下内容来创建属于同一组的多个新用户:

    Group g = new Group();
    groupsManager.create(g);

    User u1 = new User("Tom");
    User u1 = new User("Jerry");

    u1.setGroup(g);
    u2.setGroup(g);

    usersManager.create(u1);
    usersManager.create(u2);

正在创建记录,但不是每个用户属于同一个群组,而是最终有3个群组。

这两个实体类:

@Entity
@Table(name="Users")
public class User extends AbstractEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    public User() {
        super();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    //*** Some other Fields


    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
        @JoinColumn(name="group_id")
    private Group group;

    //*** Setter and Getters
}

集团:

@Entity
@Table(name="Groups")
public class Group extends AbstractEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    public Group() {
        super();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL)
     private Set<User> users;
}

2 个答案:

答案 0 :(得分:0)

我想,{groupsManager,usersManager} .create()方法确实使用了单独的EntityManager实例,这就是创建多个Group实例的原因。只需确保使用相同的EntityManager作为所有操作的上下文。

它的工作方式与此类似,因为您可以同时拥有多个持久性上下文,例如:单独的数据模型或到不同数据库的多个连接等。

我建议您执行以下操作:

  • 正确地学习JPA(从标准定义),不要把重点放在Hibernate上作为单一的专有提供者实现
  • 了解JPA如何在JavaEE应用程序服务器的上下文中工作
  • 不要使用DAO模式。它与JavaEE5之前相关(2009年之前),现在直接使用EntityManager在大多数情况下应该足够了(例如调用EntityManager.persist)

答案 1 :(得分:-1)

我简化了设计并使用了@Local接口而不是@Remote。 create()方法的两次调用都使用相同的EntityManger实例。

我个人认为使用DAO模式仍然比直接使用em.persist()更好,因为它们有助于正确构建代码。

  

使用数据访问对象的优点是相对简单的   并严格分离应用程序的两个重要部分   这可以而且应该几乎一无所知,哪些可以   预计会经常独立发展。   http://en.wikipedia.org/wiki/Data_access_object