我正在使用JDBC将JPA迁移到普通的SQL,比如持久化、保存、合并、刷新、分离和删除,在那里,iam发现很难理解EntityManager.merge(someTask)的概念。
我尝试了一个针对合并API的SQL update查询,但是合并的解释如下:将给定实体的状态合并到当前的持久性上下文.But中,使用普通的和JDBC,很难理解如何做同样的事情,我也需要处理OptimisticLock。
用于JPA的实体类如下所示。
@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。
发布于 2019-08-12 05:25:22
合并本质上是将表中的现有记录与语句中提供的内容合并的过程(即,如果记录存在UPDATE,则为INSERT)。也被称为UPSERT。
假设您有一个表tbl_person,它有主键person_ssn和另外两个列,即名称和年龄。如果您希望在person_ssn上插入一条语句,而该语句恰好存在于其中,DBs将抛出错误。如果person_ssn不存在,您的要求是插入一条记录,否则,更新名称和年龄。在这种情况下,您将使用合并。
有几种方法可以实现这一点,其中两种方法是
就Java而言,实现抽象了这个概念。根据DB对合并SQL语句的支持,可以使用它,也可以发出两个语句(SELECT,后面跟着UPDATE或INSERT)来完成相同的任务。
hsqldb根据所提供的注释提供合并SQL支持。
发布于 2019-08-12 06:34:56
除了upsert之外,还有更多的内容需要在语义上合并(在ORM上下文中)。实质上,您的实体模型是一个使用内存指针相互关联的对象图。合并API的目的是能够用当前状态反映对象图的预期未来状态。通常,ORM将发出SQL /updates/deletes,以反映预期的未来状态,而不一定是SQL合并。例如,未来的实体状态有一个与多个关系为null的关系--这将导致ORM发出查询,使子表中的外键为空,以反映该状态。简而言之,当您传递要合并的对象(这是一个相互关联的对象的图形)时,ORM首先确定单个对象是否需要新持久化,或者它们是否包含已持久化数据的标识符,然后将它们加载到持久性上下文中(如果还没有),并应用所有数据更改和关系更新。最后,ORM的脏检查机制确保生成等价的SQL来反映这一最终状态。
EntityManager -合并(T实体)将给定实体的状态合并到当前的持久性上下文中。
https://stackoverflow.com/questions/57455803
复制相似问题