gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:06:24 27 4
gpt4 key购买 nike

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

类(class)电影与类(class)流派有着多对多的关系。
这两个类都使用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

最佳答案

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

如果您知道从一开始就不会有很多类型,那么您在大多数情况下确实有几种选择可以在1 RT中进行:

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

  • 但是,实际上,除非您在谈论很多事务,否则在保存/更新之前进行简单的预查询不会降低性能。

    关于spring - 如果对象尚不存在,则将其保存在数据库中(Hibernate和Spring),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321080/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com