一对多双向关系实现postgres SpringBoot
One To Many Bidirectional relationship implementation postgres SpringBoot
我正在寻求实施多对一映射的建议 classes 并希望是否有人能为我提供清晰的图片。
一对一映射场景:Table foo 和 Table childfoo Foo 具有一对多和多对一关系
这是我目前所做的 JPA 实体实现:
@Entity
@Data
@Table(name = "foo")
public class foo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "foo_id")
private Integer fooId;
@Column(name="someId")
private Integer someId
@Column(name="comevalue")
private String somevalue;
@OneToMany(mappedBy="foo", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
private Set<ChildFoo> userRecords = new HashSet<>();
}
ChildFoo class
@Entity
@Data
@NoArgsConstructor
@EqualsAndHashCode(exclude ="foo")
@Table(name = "childfoo")
public class Childfoo implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8142203085486540150L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_record_id")
private Integer childfooId;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "foo_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Foo foo;
@Column(name="child_name")
private String childName;
}
我已经为控制器中使用的 Foo 和子 foo 创建了一个存储库来保存数据。
添加 foo 和 childfoo 的控制器代码:
Foo foo = new Foo();
foo.set...
ChildFoo childFoo = new ChildFoo();
childFoo.setChildName("abc");
childFoo.setFoo(foo);
childFoo.save(childFoo);
编辑:
现在我需要使用 someId 和 someName 值获取 childFoo。我尝试使用连接,但想知道是否有任何有效的方法可以在 ChildFooRepository/Foo Repository 中编写查询以传递 someId 和 someName。
我在 childFoo 中有此查询并收到错误:
SELECT cf from schema.child_foo cf join schema.foo f"+""
+ " ON cf.foo_id = f.foo_id"+""
+ " where f.some_id = :someid AND
f.somename= :somename
我应该在 Foo 存储库而不是子 foo 存储库中添加这个查询吗?
您需要确保 Foo
和 ChildFoo
都被持久化,并且双向关联是同步的(因此在对子项调用 setFoo(foo)
时,您还应该添加 childFoo
到父级上相应的子级集合)。
因此,在您的情况下,您可能还需要对父级调用 save
。
(参见 cascading operations and synchronizing bidirectional associations 上的文档样本)
我正在寻求实施多对一映射的建议 classes 并希望是否有人能为我提供清晰的图片。
一对一映射场景:Table foo 和 Table childfoo Foo 具有一对多和多对一关系
这是我目前所做的 JPA 实体实现:
@Entity
@Data
@Table(name = "foo")
public class foo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "foo_id")
private Integer fooId;
@Column(name="someId")
private Integer someId
@Column(name="comevalue")
private String somevalue;
@OneToMany(mappedBy="foo", fetch=FetchType.LAZY, cascade = CascadeType.ALL)
private Set<ChildFoo> userRecords = new HashSet<>();
}
ChildFoo class
@Entity
@Data
@NoArgsConstructor
@EqualsAndHashCode(exclude ="foo")
@Table(name = "childfoo")
public class Childfoo implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8142203085486540150L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_record_id")
private Integer childfooId;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "foo_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Foo foo;
@Column(name="child_name")
private String childName;
}
我已经为控制器中使用的 Foo 和子 foo 创建了一个存储库来保存数据。
添加 foo 和 childfoo 的控制器代码:
Foo foo = new Foo();
foo.set...
ChildFoo childFoo = new ChildFoo();
childFoo.setChildName("abc");
childFoo.setFoo(foo);
childFoo.save(childFoo);
编辑:
现在我需要使用 someId 和 someName 值获取 childFoo。我尝试使用连接,但想知道是否有任何有效的方法可以在 ChildFooRepository/Foo Repository 中编写查询以传递 someId 和 someName。
我在 childFoo 中有此查询并收到错误:
SELECT cf from schema.child_foo cf join schema.foo f"+""
+ " ON cf.foo_id = f.foo_id"+""
+ " where f.some_id = :someid AND
f.somename= :somename
我应该在 Foo 存储库而不是子 foo 存储库中添加这个查询吗?
您需要确保 Foo
和 ChildFoo
都被持久化,并且双向关联是同步的(因此在对子项调用 setFoo(foo)
时,您还应该添加 childFoo
到父级上相应的子级集合)。
因此,在您的情况下,您可能还需要对父级调用 save
。
(参见 cascading operations and synchronizing bidirectional associations 上的文档样本)