首页 > 解决方案 > Spring Boot JPA .save() 更新所有记录

问题描述

我有一个实体类 Alert,当我创建一个新的 ALert 并保存它时,它会用匹配的参数替换所有行,Reading 和 Priority 可以在 Alert 实体中重复。下面是 Alert.class 的代码。问题是什么?

package com.github.entity;

import javax.persistence.*;
import java.util.UUID;

@Entity
public class Alert {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "serial")
    private int u_id;
    @Embedded
    @ManyToOne(targetEntity = Reading.class)
    @JoinColumn(name = "vin")
    private Reading reading;
    private String priority;
    private UUID uuid;

    public Reading getReading() {
        return reading;
    }

    public void setReading(Reading reading) {
        this.reading = reading;
    }


    public UUID getUuid() {
        return uuid;
    }

    public void setUuid(UUID uuid) {
        this.uuid = uuid;
    }

    public String getPriority() {
        return priority;
    }

    public void setPriority(String priority) {
        this.priority = priority;
    }

}

我正在保存警报,如下所示:

Alert alert = new Alert();
alert.setUuid(uuid);
alert.setReading(reading);
if (alert.getPriority().equals("High") || alert.getPriority().equals("Low") || alert.getPriority().equals("Medium"))
alertRepository.save(alert);

更新细节1:

更新 2:这是否与会话有关?参考。在分离的实体上调用 jpa persist 不会插入重复的行。为什么?

更新 3:我认为这是因为我创建警报实体的方式。我正在使用流口水、java 规则和插入行。我已将警报创建为全局。我现在改变了这一点。

以下是我的规则,我应该在哪里/如何在规则中创建警报实体以保持:

rule "engine RPM"
    when
        alert: Alert()
        reading: Reading()
        vehicle: Vehicle(getVin() == reading.getVin(), getRedlineRpm() < reading.getEngineRpm())
    then

        new Alert().setPriority("High");

    end

标签: javaspring-bootjpadroolsrule-engine

解决方案


根据休眠文档,在使用 @JoinColumn 注释时:

它还有一个名为referencedColumnName 的参数。此参数声明将用于连接的目标实体中的列。请注意,将 referencedColumnName 用于非主键列时,关联的类必须是可序列化的。

确保您的课程可序列化


推荐阅读