【发布时间】:2019-12-18 17:10:03
【问题描述】:
我正在使用 JDBC 将 JPA api (如持久、保存、合并、刷新、分离和删除)迁移到普通 SQL,我发现很难理解 EntityManager.merge(someTask) 的概念。
我尝试了对合并 API 的 SQL update 查询,但合并的解释如下 将给定实体的状态合并到当前持久性上下文中。但是使用普通的 SQL 和 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(task) 相当于 SQL/HSQL。
【问题讨论】:
-
JPA 的
merge是一个在没有实体管理器和分离实体的情况下不存在的概念。 -
任何有关合并的 SQL 等价物的信息都会很棒:-)