2017-07-07 151 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。在这种情况下,使用版本进行乐观锁定。

另外,如果可以,请事先进行所有检查。