簡體   English   中英

Hibernate為每個OneToMany連接創建新的記錄

[英]Hibernate creates new Record for each OneToMany connection

我是一個休眠和EJB初學者。 我有一個簡單的ORM:

用戶->屬於->組

我習慣於用其他語言執行以下操作,以創建屬於同一組的多個新用戶:

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

我想,{groupsManager,usersManager} .create()方法確實使用單獨的EntityManager實例,這就是為什么要創建多個Group實例的原因。 只需確保對所有操作使用相同的EntityManager作為上下文。

它之所以這樣工作,是因為您可以同時具有多個持久性上下文,例如,單獨的數據模型或與不同數據庫的多個連接等。

我建議執行以下操作:

  • 正確地,從基礎上(根據標准定義)學習JPA,不要將Hibernate視為單個專有提供程序實現
  • 了解JPA如何在JavaEE應用程序服務器的上下文中工作
  • 不要使用DAO模式。 與JavaEE5之前(2009年之前)有關,現在在大多數情況下直接使用EntityManager應該足夠了(例如,調用EntityManager.persist)

我簡化了設計並使用@Local接口代替@Remote。 create()方法的兩個調用都使用相同的EntityManger實例。

我個人認為使用DAO模式仍然比直接使用em.persist()更好,並且它們確實很棒,因為它們有助於正確地構造代碼。

使用數據訪問對象的優點是應用程序的兩個重要部分之間的相對簡單和嚴格的分隔,該兩個重要部分可以並且應該彼此幾乎一無所知,並且可以預期其會頻繁且獨立地發展。 http://en.wikipedia.org/wiki/Data_access_object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM