2017-05-29 246 views
0

我在帳戶和組之間有多對多的關係。組表的數據是預先填充的,並且沒有添加額外的組。休眠單向@ManyToMany

使用Hibernate,我的願望是:

  1. 新增帳戶後,帳戶表,
  2. 添加記錄到ACCOUNT_GROUP表,
  3. 添加一條記錄到組表

在我看來,無論我做什麼,我總會在組表中找到重複記錄。這是我的問題。這裏是我的代碼:

Account.java

@Entity 
@Table(name = "account", schema = "admin") 
public class Account { 

    @Id 
    @GeneratedValue 
    private UUID id; 

... 

    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE }) 
    @JoinTable(name = "account_grouping", schema = "admin", joinColumns = @JoinColumn(name = "account_id"), inverseJoinColumns = @JoinColumn(name = "grouping_id")) 
    private Set<Grouping> groupings; 

... 

    // getters and setters 

} 

Grouping.java

@Entity 
@Table(name = "grouping", schema = "admin") 
public class Grouping { 

... 

    @Id 
    @GeneratedValue 
    private UUID id; 

... 

    // getters and setters 

} 

AccountDao.java

@Repository 
public class AccountDao extends AbstractJpaDao<Account, String> { 

... 

    @Transactional 
    public boolean create(Account newAccount) { 
     try { 
      getEntityManager().merge(newAccount); 
      return true; 
     } catch(Exception e) { 
      System.out.println("Danger, Will Robinson!: " + e); 
      return false; 
     } 
    } 

} 

我查了許多有關Hibernate @ManyToMany示例的問題和網站,但我一定會錯過一些東西。感謝您的閱讀和幫助。

+1

爲什麼你有一個級聯合並和堅持,因爲你真的不想添加或更新一個新的組?刪除。然後發佈實際創建帳戶的代碼,並在保存之前向其添加組。 –

+0

如果我沒有指定任何CascadeType,它會給我以下錯誤:'''在託管刷新過程中出現錯誤[org.hibernate.TransientObjectException:對象引用未保存的瞬態實例 - 在查詢刷新前保存瞬態實例'' –

+0

我應該有前面提到的Jackson正在序列化來自前端的JSON響應,該響應成爲上面的newAccount變量。 JSON中的分組變量如下所示: '''groupings:[{name:「groupa」,groupType:「typea」}] –

回答

1

不幸的是,我沒有足夠的代表發表評論,所以我會拋出我的猜測作爲答案。在保存您的實體之前,請確保該組實體在爲您的賬戶選擇一個組時保留一個ID。否則,Group實體將被視爲一個新對象,並將保存到分組表中。