一尘不染

如果对象尚不存在,则将其保存在数据库中(Hibernate和Spring)

hibernate

我正在使用Hibernate / Spring应用程序来管理一些电影。

班级电影与班级流派有着多对多的关系。这两个类都使用GeneratedValue注释生成了ID。

使用@Cascade(CascadeType.SAVE_UPDATE)通过电影对象保存了流派。我对流派的type属性(它的名称;例如“
Fantasy”)设置了唯一的约束。

我现在想做的是让Hibernate检查是否已经存在类型为“ Fantasy”的流派,如果存在,请使用该流派的ID而不是尝试插入新记录。(后者显然会引发错误)

最后,我需要的是像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

阅读 238

收藏
2020-06-20

共1个答案

一尘不染

您可能对此考虑过多。任何select-before-update / select-before-
save选项都将导致2次DB往返,第一个往返于select,第二个往返于插入(如果需要)。

如果您知道从一开始就不会有很多类型,那么大多数时候您确实有两种选择可以做到:

  1. Hibernate二级缓存可以容纳许多(如果不是全部)流派,从而在检查是否存在时可以进行简单的哈希表查找(假定为单个节点)。
  2. 您可以假设所有类型都已经存在,请使用session.load(),并处理新插入内容,因为当您引用不存在的类型时会抛出“找不到行”异常。

Realistically, though, unless you’re talking about a LOT of transactions, a
simple pre-query before save/update is not going to kill your performance.

2020-06-20