Java Spring Boot JPA.save()更新所有记录

Java Spring Boot JPA.save()更新所有记录,java,spring-boot,jpa,drools,rule-engine,Java,Spring Boot,Jpa,Drools,Rule Engine,我有一个实体类警报,当我创建一个新警报并保存它时,它会用匹配的参数替换所有行,警报实体中的读取和优先级可以重复。下面是Alert.class的代码。问题是什么 package com.github.entity; import javax.persistence.*; import java.util.UUID; @Entity public class Alert { @Id @GeneratedValue(strategy = GenerationType.IDENTI

我有一个实体类警报,当我创建一个新警报并保存它时,它会用匹配的参数替换所有行,警报实体中的读取和优先级可以重复。下面是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:


  • 首先,我根据条件在警报表中插入一条记录。然后 我使用自动生成的新ID再次插入,但 除时间戳外,警报参数(读数、优先级)相同。当我 如上所述保存警报对象所有记录都将更新 在数据库中
  • 时间戳是一个读数字段
  • vin是读数的Id
更新2:这是否与会话相关?参考文献

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

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

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

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

    end
规则“发动机转速”
什么时候
警报:警报()
阅读:阅读()
车辆:车辆(getVin()=读取.getVin(),getRedlineRpm()
根据,使用@JoinColumn注释时:

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


确保类serializable

@Embedded和@JoinColumn不能一起工作。这是两种不同的方法。删除@Embedded:)@EmilHotkowski已删除,同一问题。我不理解您的错误,您能否详细说明或提供exmaple?首先,我根据条件在警报表中插入一条记录。然后我再次插入一个自动生成的新ID,但除了时间戳之外,其他警报参数(读数、优先级)相同。当我像上面那样保存警报对象时,数据库中的所有记录都会更新。时间戳是一个读数字段。@EmilHotkowski Errm是
@Embedded
@ManyToOne
不在一起的
@JoinColumn
与此有关。有关保存对象集alert.setUuid(org.apache.commons.lang3.SerializationUtils.clone(uuid)),请参阅任何JPA映射文档:这有什么区别吗?我正在生成的id已经是唯一的。当您从db获取uuid并直接设置为新对象时,这将产生不同。