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

为什么JPA不更新一对一关系上的外键?

苏选
2023-03-14

我使用的是PlayFramework 2.3,我有以下类:

MyEntity.java:

@Entity(name = "myentity")
public class MyEntity extends Model {
    @Id
    @GeneratedValue
    public long id;

    @OneToOne(cascade = CascadeType.ALL, optional = true)
    @JoinColumn(name = "actual_version_id", nullable = true)
    public Version actualVersion;

    @OneToOne(html" target="_blank">optional = true)
    @JoinColumn(name = "next_version_id", nullable = true)
    public Version nextVersion;

    ...
}

Version.java

@Entity(name = "version")
public class Version extends Model {
    @Id
    @GeneratedValue
    public long id;

    @OneToOne
    @JoinColumn(name = "entity_id", nullable = false)
    public MyEntity entity;

    ...
}

当我想为实体创建一个新版本时,我通过分离复制它,将id设置为0,并按如下方式持久化:

public Version clone(){
    JPA.em().detach(this);
    this.id = 0;
    JPA.em().persist(this);
    return this;
}

如果我使用下面的代码,它工作正常(第一个代码)

    entity.nextVersion = entity.actualVersion.clone();
    JPA.em().flush();
    entity.actualVersion = entity.nextVersion;
    entity.nextVersion = null;
    JPA.em().flush();

我不太喜欢这个代码,因为我可以像这样使用它(第二个代码)

    entity.actualVersion = entity.actualVersion.clone();
    JPA.em().flush();

但如果我这样做,外键不会在“实体”表中更新,我不知道为什么。有人能告诉我克隆的两种实现方式有什么区别吗?对我来说,这似乎是JPA的黑魔法,但我找不到答案。

编辑:

这是一段经过重构的代码,以便更容易理解。我没有覆盖Object类中的任何函数,也没有覆盖任何其他函数(例如,我的clone()函数在原始代码中被称为newRound,带有两个参数)

我真的不想做任何模型修改,比如将CascadeType.ALL添加到注释中,或者类似的事情,因为这是一个正在生产的程序,我不知道会产生什么错误。

我只想知道为什么第一个代码更新实体(actual_version_id)中的外键,而第二个没有。我想这一定是那种级联型的。actualVersion变量中的所有批注参数。

共有1个答案

谭成业
2023-03-14

在JPA设置中要非常小心克隆();JPA 环境通常会将跟踪属性添加到类的字节码中,并且可能会混淆。相反,请覆盖默认的 clone() 以创建实际对象,并逐个手动复制所有属性。

 类似资料:
  • 无法添加或更新子行:外键约束失败(.,约束外键()引用()) 如果我删除,insert操作将会很好地工作。在将对象插入数据库之前,我检查了这些对象,并确保包含,包含。 用于创建和的SQL脚本为: Hibernate:创建表b(b_id integer not null auto_increment,string_results longtext,a_id integer,主键(b_id)) Hib

  • 问题内容: 我有一对一的关系,但是hibernatetool在生成模式时抱怨。这是显示问题的示例: 人与OtherInfo具有一对一关系: 人是OtherInfo的拥有方。OtherInfo是拥有方,因此person用于在Person中指定属性名称“ otherInfo”。 使用hibernatetool生成数据库架构时出现以下错误: 知道为什么吗?我是在做错什么还是这是Hibernate错误?

  • 我的问题可能看起来很傻。我是JPA的新手,试图理解它的基本概念。我发现有一种@multi-to-one实体关系可以在那里使用。我的问题是,为什么有人想在拥有“一对多”关系的同时使用它?我的意思是,拥有后一个就足够了解关系并发送查询了,对吗?如果没有,请解释。也许我对这两种关系的看法是完全错误的。请提供一个场景作为示例,以便我更好地理解。谢谢

  • 我在数据库中有两个表一对一的关系: 我必须使用来编写Java实体类: 客户端类: 占有实体: 我有一个klientMB,它添加了人和地址 但是当我尝试添加一个Klient时,我出现了这个错误:

  • 问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保