【问题标题】:Spring Boot JPA .save() updates all recordsSpring Boot JPA .save() 更新所有记录
【发布时间】:2019-02-11 10:17:18
【问题描述】:

我有一个实体类 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:

  • 首先我根据条件在警报表中插入一条记录。然后 我使用自动生成的新 ID 再次插入,但使用 相同的警报参数(读数、优先级),但时间戳除外。当我 像上面一样保存警报对象,所有记录都在更新 在数据库中。
  • 时间戳是一个读数字段
  • vin 是读数的 ID

更新 2:这是否与会话有关?参考。 calling jpa persist on detached entity does not insert duplicate row. Why?

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

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

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

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

    end

【问题讨论】:

  • @Embedded 和 @JoinColumn 不能一起工作。这是两种不同的方法。删除@Embedded :)
  • @EmilHotkowski 已删除,同样的问题。
  • 我不明白你的错误,你能详细说明或提供一个例子吗?
  • 首先我根据条件在alert表中插入一条记录。然后我使用自动生成的新 ID 再次插入,但使用相同的警报参数(读数、优先级),但时间戳除外。当我像上面一样保存警报对象时,所有记录都在数据库中得到更新。时间戳是一个读数字段。
  • @EmilHotkowski Errm 是@Embedded 和@ManyToOne 不能一起使用。 @JoinColumn 与它有关。请参阅任何 JPA 映射文档

标签: java spring-boot jpa drools rule-engine


【解决方案1】:

根据hibernate docs,同时使用@JoinColumn注解:

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

确保你的类可序列化

【讨论】:

  • 用于保存对象集 alert.setUuid(org.apache.commons.lang3.SerializationUtils.clone(uuid)):
  • 有什么不同吗?我生成的 id 已经是唯一的了。
  • 当您从 db 获取 uuid 并直接设置为新对象时,它会有所不同。
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2021-08-13
  • 1970-01-01
  • 2022-01-12
  • 2018-01-10
相关资源
最近更新 更多