當我有一個包含在一個方式我以前從來沒有遇到另一個實體的關係的實體,而我得到一個例外:「org.hibernate.exception.ConstraintViolationException:可能不執行聲明「。休眠 - ConstraintViolation長期以實體
父實體稱爲「發佈」。帖子可以包含多個關鍵字實體。關鍵字實體的值是唯一的,也就是說,如果兩個帖子包含相同的關鍵字,則這兩個帖子引用相同的關鍵字實體。
我的思維過程是有很多帖子,每個引用的關鍵字,任何一個關鍵字可以由多個帖子引用,所以它應該是一個@ManyToMany關係。顯然,這不起作用。檢查數據庫顯示它在開始失敗之前成功保留了幾個帖子。只要所有關鍵字都是唯一的,這似乎是好的,但我認爲,只要它試圖用已經被另一篇文章引用的關鍵字來保存文章,它就會消失。不知道如何解決這個問題。
這裏是班級的樣子(短版):
帖子:
@Entity
public class Post implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "post_id_seq")
@SequenceGenerator(name = "post_id_seq", sequenceName = "post_id_seq", allocationSize = 1)
private Long id;
@ElementCollection(fetch = FetchType.EAGER)
@ManyToMany(cascade = CascadeType.ALL)
private Set<Keyword> keywords = new HashSet<>();
}
關鍵字:
@Entity
public class Keyword implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "keyword_id_seq")
@SequenceGenerator(name = "keyword_id_seq", sequenceName = "keyword_id_seq", allocationSize = 1)
private Long id;
@Column(name = "KEYWORD_VALUE")
private String value;
private int count = 1;
}
UPDATE:
這裏是我使用的代碼在我的服務類中添加一個關鍵字的職位。基本上我有一個Post對象已經有關鍵字填充(請求通過AJAX從Web前端進來,並且Spring自動將它解組爲Post對象)。我必須遍歷每個關鍵字,並查看具有相同值的實體是否已存在於持久性中。如果是這樣,請增加該關鍵字的計數,合併它,然後將該實體添加到將取代請求中出現的Set的集合。如果它不存在,我只使用請求中的關鍵字。以前,我是不節能/將它們添加到郵政和堅持後前獨立合併關鍵詞,但我開始的錯誤,指出:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.saic.jswe.clients.swtc.domain.social.Keyword
不管怎麼說,這是我的服務代碼:
public void addPost(Post post){
Set<Keyword> keywords = new HashSet<>();
for (Keyword keyword : post.getKeywords()) {
Keyword persistedKeyword = keywordDao.findByValue(keyword.getValue());
if (persistedKeyword != null) {
persistedKeyword.setCount(persistedKeyword.getCount() + 1);
keywordDao.merge(persistedKeyword);
keywords.add(persistedKeyword);
} else {
keywordDao.persist(keyword);
keywords.add(keyword);
}
}
post.setKeywords(keywords);
postDao.persist(post);
}
另外,在我測試的過程中,當我收到這個錯誤時,它只是一個試圖添加一個測試Post對象的線程。
檢查日誌,這裏是實際約束衝突:
rg.postgresql.util.PSQLException: ERROR: insert or update on table "keyword" violates foreign key constraint "fk_3tcnkw7v196mudsgmy3nriibl" Detail: Key (id)=(1) is not present in table "post".
嗯......每上面的代碼,它應該只被添加到一個關鍵字對象的引用一個ID,如果它其實並在持久中找到它。通過請求進入Post對象的關鍵字對象應該都具有空ID,因爲它們還沒有被保留。
錯誤消息應該包含約束名稱。使用它你可以找出違反了什麼限制條件。 – talex 2014-12-04 16:22:15
我想你添加關鍵字不檢查其存在。或者有多個線程添加關鍵字。 – talex 2014-12-04 16:23:28
請檢查我的更新在原來的問題 – Bal 2014-12-04 17:00:59