我正在研究一个Hibernate /
Spring应用程序来管理一些电影.
课堂电影与班级类型有很多关系.@H_301_3@这两个类都使用GeneratedValue注释生成了id.
使用@Cascade(CascadeType.SAVE_UPDATE)通过电影对象保存该类型@H_301_3@我对类型的类型属性(这是它的名称;例如“幻想”)设置了一个独特的约束.
我现在要做的是让Hibernate检查是否已经存在类型为“Fantasy”的类型,如果有,请使用该类型的id而不是尝试插入新记录.@H_301_3@(后者显然会抛出错误)
最后我需要的是像select-before-update之类的东西,但更像是select-before-save.
Hibernate中有这样的功能吗?
一些代码:
电影课
@Entity public class Movie { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String name; @Lob private String description; @Temporal(TemporalType.TIME) private Date releaseDate; @ManyToMany @Cascade(CascadeType.SAVE_UPDATE) private Set<Genre> genres = new HashSet<Genre>(); .... //other methods
类型课程
@Entity public class Genre { @Column(unique=true) private String type; @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id ....//other methods
解决方法
你可能在想这个.任何select-before-update / select-before-save选项将导致2个DB往返,第一个用于select,第二个用于插入(如果需要).
如果你知道从一开始你就不会有很多类型,那么在大多数情况下你都可以在1 RT中做到这一点:
> Hibernate二级缓存可以容纳很多(如果不是全部)类型,在检查存在时会导致简单的哈希表查找(假设单个节点).@H_301_3@>您可以假设所有类型都已存在,使用session.load(),并处理新的插入,因为在引用尚不存在的类型时会引发行未找到异常.