Hibernate 如何不更新联接实体JPA

Hibernate 如何不更新联接实体JPA,hibernate,jpa,hibernate-mapping,one-to-one,Hibernate,Jpa,Hibernate Mapping,One To One,我将简要地解释一下情况。 我有两个实体,一个是所有者,有FKs,另一个是连接实体。 这种情况是,所有者只能关联一个非所有者,而非所有者可以关联多个所有者。 然而,我认为我需要的是一个单向的OneToOne,因为我希望能够在所有者端执行所有CRUD操作,但我不希望由于我对所有者执行的操作而更新或删除任何非所有者。如果这个推理是错误的,请纠正我。这就是我所拥有的: @Entity public class Parent { @Id @GeneratedValue(strategy =

我将简要地解释一下情况。 我有两个实体,一个是所有者,有FKs,另一个是连接实体。 这种情况是,所有者只能关联一个非所有者,而非所有者可以关联多个所有者。 然而,我认为我需要的是一个单向的OneToOne,因为我希望能够在所有者端执行所有CRUD操作,但我不希望由于我对所有者执行的操作而更新或删除任何非所有者。如果这个推理是错误的,请纠正我。这就是我所拥有的:

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @Column
    private fk_id;

// various fields with their getter and setters
    @OneToOne
    @JoinColumn(name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)
    private Child childEntity;
}

@Entity
public class Child{
    @Id
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
}
我遇到的问题如下: -尝试插入具有有效fk_id的新所有者会导致 在调用save()错误之前,必须手动分配此类的ID 我试图解决这个问题,但很快意识到这其实不是问题所在。我遇到这个问题是因为当创建一个新的所有者时,JPA实际上试图创建一个链接到此父级的子级,但它不能这样做,因为我没有ID的生成策略(这是我想要的)

在多次尝试之后,我觉得这就是问题所在,我无法添加链接到现有子级的新父级,因为对于每个尝试添加JPA的父级,我都会尝试添加相应的新子级

我原以为我会用单向OneToOne关系解决这个问题,但要么我做错了,要么别的什么事情错了,因为单向OneToOne需要我一个我不想要的级联类型

编辑:我正在尝试插入一个新的所有者,该所有者链接到一个非所有者,如下所示:

public Long insertAccount(Owner record) {
        insert(record);
        return record.getId();
    }

public Long insert(T entity) {
        entityManager.persist(entity);
        return entity.getId();
    }
insertable=false、updateable=false似乎是必需的,因为fk_id也是类的一列

编辑2:在所有者中包含以下内容:

    @ManyToOne
    @JoinColumn(name = "fk_id", insertable = false, updatable = false)
    private Child childEntity;
我得到以下错误:

对象引用未保存的临时实例-在刷新之前保存临时实例

有没有办法在不添加级联选项的情况下修复它?如上所述,在插入新所有者时,我根本不想更改非所有者端

我想到的另一个例子是: 所有者=有大学参考的学生 非所有者=大学

学生班有@manytone注释,大学班没有任何注释。我希望它是单向的,我想添加一个新的学生,这将有一个大学的参考,但我不想添加另一所大学与该学生

这就是JPA试图做的事情(父亲->孩子)关系是多方面的

我不太理解这个问题,如果子实体已经存在, 您必须获得BBDD的完整对象,以便它不是一个临时实体 并将其确立为父属性

此外,删除insertable false和Updateable false,它是隐式的:

@JoinColumn (name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)
如果要将其设置为true,则必须设置关系类型、删除类型、更新类型。。。等

@ManyToOne (cascade = {CascadeType.MERGE, CascadeType.PERSIST})
你能给新爸爸写一段代码吗

编辑2:

暂时性错误是您试图插入父实体的原因。它包含要关联的子实体,该子实体与数据库条目不完全相同。子实体是否存在于DDBB中?如果回答为“是”,则您具有子实体的id,请尝试以下操作:

public Long insert(T entity) {
    //This line complete te object child
    entity.setChild(em.find(Child.class,entity.getChild().getId()))
    entityManager.persist(entity);
    return entity.getId();
}

你对父子关系的看法绝对正确。我可能不够清楚,因为我不确定自己是否理解正确。实际关系如下:我有实体x和实体y。每个x只能有一个y与其关联。y可以有许多不同的x关联。由于x是FK的所有者,我认为OneTONE协会是最好的。我将编辑我的问题,添加我如何坚持和这条信息,我为不够清楚而道歉