gpt4 book ai didi

mysql - Eclipselink 历史策略不适用于 MySQL 生成的 id

转载 作者:行者123 更新时间:2023-11-29 18:22:36 25 4
gpt4 key购买 nike

我有一个简单的实体对象和历史策略

@Entity
@Customizer(MyHistoryPolicy.class)
@Table(name = "employee")
public class Employee {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

... accessor methods
}


public class MyHistoryPolicy implements DescriptorCustomizer {

public void customize(ClassDescriptor descriptor) {
String historyTableName = descriptor.getTableName() + "_history";
HistoryPolicy policy = new HistoryPolicy();
policy.addHistoryTableName(historyTableName);
policy.addStartFieldName("start_date");
policy.addEndFieldName("end_date");
descriptor.setHistoryPolicy(policy);
}
}

插入一个新对象效果很好。更新对象会导致 id 设置为零。我从 Eclipselink 看到以下调试日志

UPDATE employee SET name = ? WHERE (id = ?)
bind => [test name, 2]
UPDATE employee_history SET end_date = ? WHERE ((end_date IS NULL) AND (id = ?))
bind => [2017-09-27 17:45:25.316, 2]
INSERT INTO employee_history (id, name, start_date) VALUES (?, ?, ?)
bind => [2, test name, 2017-09-27 17:45:25.316]
SELECT LAST_INSERT_ID()

注意历史表插入后的“SELECT LAST_INSERT_ID()”。历史表没有生成的 id,因此此查询返回零,并且该值将被覆盖到对象的 id 字段中。原始 ID 丢失,这对应用程序来说是有问题的。

有谁知道如何克服 Eclipselink 与 MySQL 的这个缺陷?

最佳答案

为了防止有人偶然发现这个问题,我确实开发了一种对我有用的解决方法。它很简单,因为它只是使用 JPA 监听器来保存和恢复丢失的 Id。这是我的代码:

@MappedSuperclass
public abstract class EclipseLinkHistoryFix {

@Transient
private Long savedId;

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@PreUpdate
public void saveId() {
savedId = getId();
}

@PostUpdate
public void restoreId() {
if (savedId != null) {
if (id == null || id.longValue() != savedId.longValue()) {
setId(savedId);
}
savedId = null;
}
}

public final Long getId() {
return id;
}

public final void setId(Long id) {
this.id = id;
}
}

此 hack 依赖于 EclipseLink 的内部行为,因此在未来的更新中可能不起作用。幸运的是,在 v2.6.4 中,插入历史记录后会调用 PostUpdate 回调,因此效果很好。

关于mysql - Eclipselink 历史策略不适用于 MySQL 生成的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46445470/

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