2017-07-07 82 views
0

問題:簡單的例子,我們有一個表:保存數據與uniq的領域

@Entity 
@Table(name = "books") 
public class Book { 
    // other columns 
    private Set<Genre> genres = new LinkedHashSet<>(); 

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
    @JoinTable(name = "book_genre", joinColumns = {@JoinColumn(name="book_id")}, inverseJoinColumns = {@JoinColumn(name="genre_id")}) 
    @OrderBy("name ASC")  
    public Set<Genre> getGenres() { 
      return genres; 
    } 
} 

類型表(實體)具有獨特的列,這列已經包含一行名例如流派,現在如果我會盡力保存新實體相同流派名稱:

Set<Genre> newBookGenres = new LinkedHashSet<>(); 
    Genre newBookGenre = new Genre("Example genre"); //new genre with name [Example genre] 
    newBookGenres.add(newBookGenre); 
    Book book = new Book(newBookGenres); 
    session.save(book); 

它不會保存該書並拋出唯一列的異常(示例流派已存在於流派名稱中)。

問題:我該如何保存這樣的實體?我認爲,在保存圖書之前,我可以搜索類型該書類型名稱表,如果存在(在數據庫中)具有相同名稱的類型,那麼只需將書類型對象替換爲數據庫類型對象。但我不知道它是否會起作用,並相信有最簡單的方法。

回答

2

您變種,是不錯的,工作variant.It的良好做法。你可以添加在Java方面一些驗證,用於驗證對象已經存在,而不是調用DAO方法保存,如果驗證失敗。在這種情況下,您不需要嘗試保存實體並捕獲異常。由於save()方法可能不像您所展示的那麼簡單,因此可以節省驗證時間。你

也可以換道的方法保存()它catch塊,並與例外的工作,但它是不好的做法,你應該運行時異常工作的提前與驗證處理它來代替。

當你的實體(複印件)可能會被其他用戶或用戶在您的保存可能帶來分貝constains問題,即使您的驗證是確定被modifyed。在這種情況下,使用版本進行樂觀鎖定。

另外,如果可以,請事先進行所有檢查。