当前位置: 首页 > 面试题库 >

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

轩辕鸿祯
2023-03-14
问题内容

我正在使用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

问题答案:

您可能对此考虑过多。任何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.



 类似资料:
  • 问题内容: 我有以下问题,当试图在数据库中插入对象时,Hibernate卡住,没有返回错误,对象没有正确保存。 调试它,我发现它挂在 我正在使用PostgreSQL作为数据库。 我的配置文件: SELECT部分​​起作用。 我不确定我缺少什么。同样使用本地SQL插入命令,它也可以工作。 问题答案: 我没看到你这么忙 但最可取的是

  • 我正在使用DB2数据库和hibernate框架。有两个表,如Word和Litter,它们的关系是一对多。 > 架构A: 但是这段代码给出了一个异常:JDBCExceptionReporter logExceptions是我正在使用的方法吗?

  • 我正在尝试对可能存在属性的对象进行查询。但是我在获取

  • 我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它

  • 我是postgreSQL的新手,我正在尝试创建一个模式文件,其中包含创建数据库和所需表所需的所有脚本。我过去为SQl服务器执行此操作的方式是检查数据库是否存在,然后运行必要的脚本。 postgreSQL中的以下脚本引发了一个错误:“无法从函数或多命令字符串执行创建数据库” 我通过导出数据库的备份创建了一个postgres数据库转储文件,但其中包含, 这意味着每次运行模式文件时,数据库都会被删除并重

  • 我试图用JPA将一个对象保存到数据库中。对象有两个属性age和email。电子邮件是@id和字符串类型。 如果我试图用相同的电子邮件保存两个对象。最后一个更新数据库。 如何使上次保存失败?