gpt4 book ai didi

java - 从多个拥有实体到实体的 OneToOne 映射

转载 作者:行者123 更新时间:2023-11-30 09:39:40 24 4
gpt4 key购买 nike

我是 JPA 新手。我有一个我认为非常简单的例子,但我在实现它时遇到了麻烦。基本上,我有一个要在其他实体中“重用”的实体。

我有一个 User,它有两个字段 - HomeOffice。这些中的每一个依次引用一个 Address,如下所示:

@Entity
public class User extends Model {

@Column
private String name;

@OneToOne
private Home home;

@OneToOne
private Office office;

}

@Entity
public class Home extends Model {

@OneToOne
private Address address;

@OneToOne(mappedBy="home")
private User user;

// ...

}

@Entity
public class Office extends Model {

@OneToOne
private Address address;

@OneToOne(mappedBy = "office")
private User user;

// ...
}

@Entity
public class Address extends Model {

@Column
private String line1;

@Column
private String line2;

@Column
private String city;

/*
* Is this possible? Being owned by two entities?
*/


@OneToOne(mappedBy="address")
private Home home;

@OneToOne(mappedBy="address")
private Office office;

// ...
}

我如何实现这一目标?


编辑

我最初遇到这个异常:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on example.Home.address references an unknown entity: example.Address

事实证明,其中一个类从 org.hibernate 而不是从 javax.persistence 导入了 @Entity 注释。解决这个问题后,原来的异常就消失了(this 帮我查明了问题所在)

但是,我现在有一个新的异常(exception):

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: example.User.home -> example.Home

这个我不是很了解。在对 User 实例执行此操作之前,我是否应该调用 save Home 对象?

最佳答案

我通过将 cascade=CascadeType.ALL 属性添加到所有实体中的所有 @OnetoOne 注释来解决这个问题。

如果没有此注释,我将不得不先保存每个拥有实体,然后再保存拥有实体。例如,我必须先保存一个 Home,然后再保存该住宅所属的 User

cascade 属性添加到注释中可以为您解决这个问题。您只需保存 UserHomeAddress 会自动为您保存。

This帖子帮我解决了问题。

关于java - 从多个拥有实体到实体的 OneToOne 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9737328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com