10

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

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

流派是通过电影对象使用@Cascade(CascadeType.SAVE_UPDATE) 保存的。我在流派的类型属性上放置了一个唯一的约束(这是它的名称;例如“幻想”)。

我现在想做的是让 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
4

2 回答 2

7

这个你可能想多了。任何 select-before-update/select-before-save 选项都会导致 2 次 DB 往返,第一次用于选择,第二次用于插入(如有必要)。

如果您从一开始就知道您不会有很多流派,那么大多数时候您确实有几个选择可以在 1 RT 中执行此操作:

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

但实际上,除非您谈论大量事务,否则保存/更新之前的简单预查询不会影响您的性能。

于 2013-01-14T15:34:22.700 回答
3

我在 Hibernate 中没有听说过这样的功能 select-before-update/select-before-save 在这种情况下,您应该将 Hibernate 视为 JDBC。

首先,如果你想知道你是否有这样的流派,你应该查询它。

如果你这样做。那么 SAVE_UPDATE 将不会在您将其添加到电影时创建新的。如果你不这样做,Hibernate 将在数据库中创建一个新的 Genre 行并为你添加到 many_to_many 表的连接。

于 2013-01-14T15:26:34.930 回答