2017-07-25 113 views
0

在hibernate中,我創建了用戶和角色之間的一對多關係。 多於一個用戶可以與一個角色關聯,但用戶只能與一個角色關聯。休眠不保留參照完整性

在用戶級,我有

  @ManyToOne 
      @JoinColumn(name = "role_id") 
      private Role role_id; 

在角色類,我有

@OneToMany(mappedBy="role_id", fetch=FetchType.LAZY) 
    private Collection<User> userList = new ArrayList<User>(); 

如果我保存一個新的用戶爲:

{ 
"userName" : "Michael", 
"role_id" : { 
       "id" : 8  
      } 
} 

它甚至可以節省用戶當角色表沒有與id作爲8的角色(並且沒有條目在角色表中完成)。 我希望每當我用一個不存在的角色保存用戶時,我都應該得到一個引用完整性錯誤。 我應該改變什麼?

我的用戶表作爲創建:

CREATE TABLE `users` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `email` varchar(255) DEFAULT NULL, 
    `mobile` varchar(255) DEFAULT NULL, 
    `username` varchar(255) NOT NULL, 
    `role_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_abcdef` (`role_id`), 
    CONSTRAINT `FK_abcdef` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

請告知您如何堅持實體? – fg78nc

回答

0

你有FK約束在數據庫中的表?也許this如果你使用mySql可以幫到你。或者,您可以自行設置數據庫中的限制。

+1

感謝loannis,但我有外鍵約束集。 請參閱更新後的答案 – shubh

0

在您的@OneToMany註釋中,您可能需要添加targetEntity = User.class。這是因爲以下幾個原因:

  1. Java泛型使用類型擦除,這意味着在生成的字節碼,你的userList不是Collection<User>類型Collection類型。所以,除非你明確地告訴它,hibernate並不知道目標實體是什麼。 Hibernate通常喜歡遵循一個無聲的錯誤/隱藏錯誤的方法,這意味着它在它們發生的那一刻默默地忽略問題(例如它不知道什麼類型的收集元素是什麼)並且失敗後來,當問題的原因不再清楚了。 (例如,當你執行一個應該失敗的查詢,它不會,或者你執行一個查詢應該取一些東西,並且它什麼都不會取得。)

  2. 從java 9開始,編譯器確實存儲有關在生成的.class文件中創建通用字段時使用的實際類型參數的信息,並且可以使用反射來發現該信息,但我不知道已更新hibernate以檢查此信息。

+0

JPA規範只需要'targetEntity'用於原始集合,它應該能夠獲得泛型類型。我相信這不是必需的。 – fg78nc

+0

@ fg78nc如果這是正確的,我會刪除我的答案。但我相信這就是過去爲我工作的原因,並且我看到很多使用'targetEntity'的代碼沒有原始集合,所以我當然希望OP能夠嘗試。 –

+0

我剛纔說'targetEntity'的目的是針對原始收藏按規格。如果它適合你,那很好,讓他試試。 – fg78nc