首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是与JPA合并API等价的SQL/JDBC?它到底是做什么的?

什么是与JPA合并API等价的SQL/JDBC?它到底是做什么的?
EN

Stack Overflow用户
提问于 2019-08-12 04:53:03
回答 2查看 493关注 0票数 1

我正在使用JDBC将JPA迁移到普通的SQL,比如持久化、保存、合并、刷新、分离和删除,在那里,iam发现很难理解EntityManager.merge(someTask)的概念。

我尝试了一个针对合并API的SQL update查询,但是合并的解释如下:将给定实体的状态合并到当前的持久性上下文.But中,使用普通的和JDBC,很难理解如何做同样的事情,我也需要处理OptimisticLock。

用于JPA的实体类如下所示。

代码语言:javascript
复制
@Entity
@Table(name = "TASK", indexes = {@Index(name = "RIO", columnList = "priority", unique = false),
@Index(name = "EXP", columnList = "expiry", unique = false), 
@Index(name = "STA", columnList = "taskStatus", unique = false),
@Index(name = "CAT", columnList = "category", unique = false),
@Index(name = "NEXTTRY", columnList = "nextTry", unique = false)})

public class TaskEntity {

@Version
private int version;

@Basic
@Column(length = Integer.MAX_VALUE, columnDefinition = "varchar(" + Integer.MAX_VALUE + ")")
private String taskId;

@Basic
private String category;

@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "KEY")
@CollectionTable(name = "TASKPROPERTIES", foreignKey = @ForeignKey(
                 name = "TASK_ID_FK",
                 foreignKeyDefinition = "FOREIGN KEY (TASKENTITY_ID) REFERENCES TASK (ID) ON DELETE CASCADE"))

@Column(length = Integer.MAX_VALUE, columnDefinition = "varchar(" + Integer.MAX_VALUE + ")")
private Map<String, String> TaskProperties;

@Basic
@Column(length = Integer.MAX_VALUE, columnDefinition = "varchar(" + Integer.MAX_VALUE + ")")
private String destination;

@Enumerated(EnumType.STRING)
private TaskStatus taskStatus;

@Basic
private String type;

@Basic
private Long expiry;

@Basic
private Long nextTry;

@Basic
private Integer retries;

@Basic
private Integer priority;

//Setters and Getters
//Equals and HashCode

}

因此,EntityManger.merge(任务)等同于SQL/HSQL。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-12 05:25:22

合并本质上是将表中的现有记录与语句中提供的内容合并的过程(即,如果记录存在UPDATE,则为INSERT)。也被称为UPSERT

假设您有一个表tbl_person,它有主键person_ssn和另外两个列,即名称和年龄。如果您希望在person_ssn上插入一条语句,而该语句恰好存在于其中,DBs将抛出错误。如果person_ssn不存在,您的要求是插入一条记录,否则,更新名称和年龄。在这种情况下,您将使用合并

有几种方法可以实现这一点,其中两种方法是

  1. 至少发出两个DML语句。首先在上选择,然后根据是否找到记录,然后发出UPDATE插入语句。
  2. 使用合并 SQL语句。这是一种更现代、更直接的方式,但并非所有数据库都支持它。阅读更多信息,这里。此外,为了了解一下如何在支持合并SQL语句的Server中运行,请检查这里

就Java而言,实现抽象了这个概念。根据DB对合并SQL语句的支持,可以使用它,也可以发出两个语句(SELECT,后面跟着UPDATE或INSERT)来完成相同的任务。

hsqldb根据所提供的注释提供合并SQL支持。

票数 1
EN

Stack Overflow用户

发布于 2019-08-12 06:34:56

除了upsert之外,还有更多的内容需要在语义上合并(在ORM上下文中)。实质上,您的实体模型是一个使用内存指针相互关联的对象图。合并API的目的是能够用当前状态反映对象图的预期未来状态。通常,ORM将发出SQL /updates/deletes,以反映预期的未来状态,而不一定是SQL合并。例如,未来的实体状态有一个与多个关系为null的关系--这将导致ORM发出查询,使子表中的外键为空,以反映该状态。简而言之,当您传递要合并的对象(这是一个相互关联的对象的图形)时,ORM首先确定单个对象是否需要新持久化,或者它们是否包含已持久化数据的标识符,然后将它们加载到持久性上下文中(如果还没有),并应用所有数据更改和关系更新。最后,ORM的脏检查机制确保生成等价的SQL来反映这一最终状态。

EntityManager -合并(T实体)将给定实体的状态合并到当前的持久性上下文中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57455803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档