【发布时间】:2023-03-20 00:19:01
【问题描述】:
我有一个简单的实体对象和历史策略
@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丢失,这对应用程序来说是有问题的。
有谁知道如何用 MySQL 克服 Eclipselink 中的这个不足?
【问题讨论】:
-
这是known bug in EclipseLink。 2010年报道! 7 年过去了,我想我有 2 次机会解决这个问题Buckley's and Nunn。
标签: mysql eclipselink