【问题标题】:Hibernate creates new Record for each OneToMany connectionHibernate 为每个 OneToMany 连接创建新记录
【发布时间】:2013-06-03 22:05:03
【问题描述】:

我是一个休眠和 EJB 初学者。我有这个简单的 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;
}

【问题讨论】:

  • 什么是 UserManager 和 GroupNamager?他们的相关方法是如何实现的?请注意,您的双向关联未正确映射。 OneToMany 必须有mappedBy="group"。

标签: java database hibernate orm mapping


【解决方案1】:

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

它的工作原理是这样的,因为您可以同时拥有多个持久性上下文,例如单独的数据模型或到不同数据库的多个连接等。

我建议执行以下操作:

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

【讨论】:

  • 这就是为什么我在 Stackoverflow 上获得支持以深入了解 JPA。
【解决方案2】:

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

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

使用数据访问对象的好处是比较简单 严格区分应用程序的两个重要部分 可以而且应该彼此几乎一无所知,并且可以 预计会频繁且独立地发展。 http://en.wikipedia.org/wiki/Data_access_object

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 2023-03-27
    • 2020-09-28
    • 1970-01-01
    • 2012-08-14
    • 2014-06-08
    • 1970-01-01
    • 2020-08-18
    • 2021-11-13
    相关资源
    最近更新 更多