gpt4 book ai didi

java - 如何使用 Hibernate 根据现有列填充集合

转载 作者:行者123 更新时间:2023-12-01 16:14:14 25 4
gpt4 key购买 nike

我有两个现有的表,它们都有一个属性(示例代码中的 someField )。

我想做的:填充集合Foo.bars与所有Bar具有相同 someField 的实体值为 Foo我正在加载的实体。

我不想创建额外的联接表,因为我不想显式更新关系。

如何通过实体和/或其字段上的注释来实现这一点?

一些说明:

  1. 两个someField列是独立修改的。
  2. 这两列中的任何一列都没有唯一键约束(这就是我添加 @ManyToMany 的原因)。
  3. 我不需要外键关系或任何级联。
  4. 如果集合被修改,则不应更新列。我希望 hibernate 仅在加载 Foo 时填充集合实体。
  5. 我尝试使用 @JoinFormula没有任何 @XtoY关系,但无法使其发挥作用。
  6. 这种关系仅从一侧建模,因为我从不关心 Foo如果我有 Bar实例。

我正在使用 spring-boot-starter-data-jpa 2.3,它使用 Hibernate 5.4.15

@Entity
public class Foo{

@Id
@GeneratedValue
private int id;

private int someField;

@ManyToMany
private Set<Bar> bars;

}

@Entity
public class Bar{

@Id
@GeneratedValue
private int id;

private int someField;

}

更新2020年6月22日

由于我无法表达我的用例,我创建了一个最小的 github project .

我发现实现所需行为的唯一两种方法是:

  1. 实现显式 Controller 逻辑,加载关联的 Bar手动实例。

  2. 实现附加到 FooRepository 的 AspectJ 方面load 方法手动获取关联的 Bar实例。

两者都“错了”,因为我认为这属于 hibernate 的范围,并且它创建了很多额外的数据库查询。

最佳答案

所以首先,我不明白你为什么要使用 @ManyToMany 因为那是针对 n 对 n 关系的,而你的关系看起来不是这样的。

您可以通过两种方式建模父子关系,最有效的一种是 ManyToOne 映射,其中子项管理父项的外键:

@Entity
public class Parent {

@Id
@GeneratedValue
private int id;

private int someField;

}

@Entity
public class Child {

@Id
@GeneratedValue
private int id;

private int someField;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "someField",
referencedColumnName = "someField",
unique = false,
updateable = false,
insertable = false)
private Parent parent;

}

您可以使用 JPQL/Criteria 查询来获取您需要的所有内容。

了解更多关于ManyToOne associations的信息。这里some more .

请参阅@JoinColumn docs对于“唯一”等属性。

如果您坚持以相反的方式这样做,那也会起作用:

@Entity
public class Parent {

@Id
@GeneratedValue
private int id;

private int someField;

@OneToMany(
// cascade = What operations do you want to cascade? Who is the owner of the relationship?
// orphanRemoval = Do you want to delete orphaned children?
)
@JoinColumn(name = "someField",
unique = false,
updateable = false,
insertable = false)
private List<Child> children = new ArrayList<>();

}

@Entity
public class Child {

@Id
@GeneratedValue
private int id;

private int someField;

}

这是一个单向映射,但如果您愿意,您可以将“父级”关联添加到子级。然后您必须添加方法以确保它们同步([参见此处])4

如果它们不是唯一的并且没有外键,我不确定这是否有效。但在这种情况下,您可以使用 @JoinFormula提供要加入的 SQL 查询。

关于java - 如何使用 Hibernate 根据现有列填充集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62447466/

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