我有一个cronjob在运行,每天计算一次很多东西。
有2个参与者。
第一个是“KPI”实体,包含有关用户活动的信息。 每个KPI实体与用户ofc相关的是1:1。 KPI实体本身与1:n相关,更详细的深入分析。 (它是KPI实体中的元素集合。)
Simpliefied:
@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;
}
所以,我假设hibernate创建了2个表:
“的KPI”:
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实体进行UPDATE,Hibernate似乎也试图将值插入到第二个表中 - 由于约束而失败。
有什么想法吗?