我有一个 cronjob 正在运行,每天计算很多东西。
涉及2个实体。
第一个是“KPI”实体,包含有关用户活动的信息。每个 KPI 实体都与用户 ofc 1:1 相关。KPI 实体本身与更详细的钻取 1:n 相关。(它是 KPI 实体内的元素集合)。
简化:
@Entity
@Table(name = DBConstants.KPI_TABLE_NAME)
@NamedQueries({ @NamedQuery(name = "kpi.byUser", query = "SELECT k FROM KPIEntity k WHERE k.user = :user"),
@NamedQuery(name = "kpi.all", query = "SELECT k FROM KPIEntity k"),
@NamedQuery(name = "kpi.allactiveusers", query = "SELECT k FROM KPIEntity k WHERE k.user.accountActive = :accountstatus") })
public class KPIEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private long tasksCompleted;
@ElementCollection(targetClass = java.lang.Long.class, fetch = FetchType.EAGER)
@MapKeyClass(java.lang.String.class)
@MapKeyColumn(name = "taskKey")
@CollectionTable(name = "KPItaskDrilldown", joinColumns = @JoinColumn(name = "id"))
@Column(name = "count")
private Map<String, Long> tasksCompletedPerType;
}
所以,我假设休眠创建2个表:
“关键绩效指标”:
id | tasksCompleted
1 | 250
2 | 50
KPItaskDrilldown
kpi_id | tasksCompletedPerType | count
1 | A | 20
1 | B | 75
...
这“有效” - 第一次运行。但如果 cronjob 再次运行,我会收到 Duplicate-Key-MySQL-Errors。
我注意到,Hibernate 在钻取表上创建了一个复合键:kpi_id, tasksCompletedPerType
. 到目前为止,这似乎还不错。
但即使我对 KPI 实体进行更新,Hibernate 似乎也会尝试将值插入到第二个表中 - 由于约束,这将失败。
有任何想法吗?