当前位置: 首页 > 面试题库 >

Hibernate(JPA)多个@OneToMany用于同一模型

卫俊力
2023-03-14
问题内容

我有两个模型。

@Entity
public class Student
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    protected long id;

    @?
    protected Address homeAddress;

    @?
    protected Address schoolAddress;
}

@Entity
public class Address
{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   protected long id;

   @?
   protected List<Student> students;
}

什么JPA / Hibernate注解,我需要把上面homeAddressschoolAddress并且students使协会工作?

当然,我尝试了很多事情,但没有任何效果。例如,设置

    @ManyToOne
    @JoinColumn (name="student_homeAddress_id", updatable = false, insertable = false)
    protected Address homeAddress;

    @ManyToOne
    @JoinColumn (name="student_schoolAddress_id", updatable = false, insertable = false)
    protected Address schoolAddress;

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinColumns({
    @JoinColumn(name = "student_homeAddress_id", referencedColumnName = "student_homeAddress_id"),
    @JoinColumn(name = "student_schoolAddress_id", referencedColumnName = "student_schoolAddress_id")})
    @IndexColumn(name="students_index")
    protected List<Student> students;

ald Unable to find column with logical name: student_homeAddress_id in org.hibernate.mapping.Table(Address) and its related supertables and secondary tables。也尝试使用,mappedBy但是只接受一个参数(不能这样做mappedBy="student_homeAddress_id, student_schoolAddress_id"

还考虑过将其移动JoinColumnsStudent平板电脑上,但是我不确定OneToMany和ManyToOne的注释应该是什么样,因为我在那里有多个地址,而JoinColumns并没有多大意义。

起作用但未创建关联的事物有:

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
    @JoinColumn(name="address_id")
    @IndexColumn(name="students_index")
    protected List<Student> students;

使用此方法,在将模型存储在数据库中时,即使存储了两端(Student and
Address模型),student_homeAddress_id和student_schoolAddress_id也始终为空。

我的想法是,在Address表上将有3个额外的列:student_homeAddress_id(homeAddress在Student表中的Student的ID),student_schoolAddress_id(在schoolAddress的Student表中的Student的id)和students_index(0
students列表中基于位置的位置)。这样就足够了,对吗?

有任何想法吗?

非常感谢!


问题答案:

我们尝试了梅尔的建议,但未能成功。

我们最终遵循了这一行之有效的方法。

换句话说,我们有OneToMany关系:

Student

protected List<AddressStudentAssociation> addresses;

Address

protected List<AddressStudentAssociation> students;

并继续AddressStudentAssociation

@ManyToOne
@PrimaryKeyJoinColumn(name="STUDENTID", referencedColumnName="id")
private Student student;
@ManyToOne
@PrimaryKeyJoinColumn(name="ADDRESSID", referencedColumnName="id")
private Address address;

加上用于将一个地址与另一个地址(isHome)分开的参数。

最后,在内部Studentpublic Address getHomeAddress()一个遍历addresses列表并返回正确地址的地址。我们还必须使用注释来使其起作用。一般而言,它不是最佳方法,但是它可以工作,并且我们已经花了太多时间试图使事情起作用。:|



 类似资料:
  • 问题内容: 我目前正在阅读有关实体关联的Hibernate文档,但遇到一些困难却难以理解。它在本质上做的区别和联系。尽管我在实际项目中使用了它们,但是我无法完全理解它们之间的差异。据我了解,如果一个表/一个实体与另一个实体有关联,则该关联应来自另一侧。那么,我们应该如何根据具体情况决定选择哪个呢?它又如何影响数据库/查询/结果?到处都有很好的例子吗? PS:我认为这与问题相关,如果有人可以解释关联

  • 我正在尝试编写一个简单的应用程序,其中包含一个跟踪每个用户支付的款项的表和一个包含每个用户支付的总金额(所有付款的总和)的第二个表。目前,两个表都有相同的字段(firstName、lastName、金额),我已经将它们从同一个Java类映射到多个表,我无法将该类映射到多个表。对此有什么简单的解决方案吗?

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 拥有2个实体:订单和产品。1个订单可以有多个产品,多个产品可以属于1个订单(每个产品只属于1个订单)。 尝试了@JsonIgnore。这不会返回子元素或父元素。尝试了@JsonManagedReference和@JsonBackReference-仍然没有成功。 请给我指点一下

  • 问题内容: 我有一个具有和的实体。我也有一个实体。我试图使单个地址表同时包含送货地址和帐单地址,因为没有什么区别它们,并且在一个或多个订单中帐单地址和送货地址可以相同。我已经在中使用了地址字段,但是我不确定使这种双向传输正确的方法。 我有两个问题: 是否适合地址字段,因为它实际上是n:2关系,我只是使用两个单独的字段来表示?如果没有,我该怎么办? 假设1.可以,那么如何使映射双向化(在实体中应使用

  • 我目前使用Spring Boot和Hibernate与单一数据源访问单一数据库。我需要读取和写入数据库。直到现在一切都很好。 现在,当谈到SQL注入时,我的项目经理有点偏执,尽管我们尽了最大努力来参数化任何接受任何类型用户输入的查询。因此,他问我是否可以使用两个数据库用户连接到同一个数据库:一个具有读/写访问权限,另一个具有只读访问权限。这样,对于每个只需要读取访问权限的查询,我可以使用只读用户,