3

我有一个 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 似乎也会尝试将值插入到第二个表中 - 由于约束,这将失败。

有任何想法吗?

4

0 回答 0