当前位置: 首页 > 知识库问答 >
问题:

JPA级联类型不会像我预期的那样工作

谯和煦
2023-03-14

你好,亲爱的StackOverflow社区,我最近遇到了一个问题,我不能把一个已经保存的对象的引用放进去。我不想保存或更新对象,因为这些对象是预先插入到我们的数据库中的。

所以基本上我的情况是这样的:我有一个父,在本例中它是一个摄取,对象有一个IntakeTimes列表,它们被声明为remainingdoses。有道理,嗯。

我的模型看起来如下:

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name="child_disease")
public class ChildDisease extends BaseEntity {

    @ManyToOne(cascade = CascadeType.DETACH)
    @JoinColumn(name="child_Fk")
    private Child child;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="disease_Fk")
    private Disease disease;

    @OneToOne(cascade = CascadeType.PERSIST, orphanRemoval = true, fetch=FetchType.EAGER)
    @JoinColumn(name = "medication_decree_Fk")
    private MedicationDecree medicationDecree;
}
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table
public class MedicationDecree extends BaseEntity {

    @Column
    private float consumptionAmount;

    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private MeasuringUnit measuringUnit;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="medication_Fk")
    private Medication medication;

    @OneToOne(cascade = CascadeType.PERSIST)
    private Intake intake;

    @ManyToMany(cascade = CascadeType.MERGE)
    private List<IntakeTime> intakeTimes;
}
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Intake extends BaseEntity {

    @OneToMany(cascade = CascadeType.MERGE)
    public List<IntakeTime> remainingDoses;

    @Column
    public Date date;
}

我期待着任何帮助或提示,谢谢社区。

共有1个答案

满元凯
2023-03-14

发生错误,因为您试图保存一个已经存在于db中的实体(分离),但是默认的JParepository无法识别实体是新的还是旧的,所以它试图在db中创建一个新的实体。

你可以用多种方法来解决这个问题。方法之一是实现persistable接口。基本上,您需要使实体实现可持久化并提供isnew()getid()方法,并且可以使用这样的逻辑,即如果已经填充了'id字段,则可以在isnew()`中返回true

public class Intake extends BaseEntity implements Persistable{
   @override
   public Boolean isNew(){
      return this.id==null;//or any other logic with which you can identify if it's a new object or not 
   }
}

参考:Persistable SpringDoc

 类似资料:
  • 最后是持久性上下文配置: 我很感谢你的帮助。

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 我有两个Avro模式V1和V2,在spark中读取如下: V1有两个字段“一”和“二” V2 与新字段:“三” 场景:编写器使用 V1 进行写入,读取器使用 V2 对 avro 记录进行解码。我的期望是看到字段3填充了默认值,即null。但是我在spark工作中遇到了以下异常。 我是不是错过了什么?我的理解是avro支持向后兼容。

  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >

  • 为什么下面的失败? 测试的正确方法是什么?

  • 下面是一个类和log4j配置: $vi My.java $vi log4j2.xml 在日志/foo.bar.log中出现和消息。这是我所期望的。但是在日志/foo.log中什么都没有出现,我期望那里有消息。在控制台上也什么都没有出现,但是我期望消息。所以它没有像我预期的那样工作。那么我的错误是什么? 还有LogManager的论点。getLogger必须是记录器的名称。但我也看到了论点是类的例子