一对多双向关系实现postgres SpringBoot

时间:2021-05-12 15:40:02

标签: spring-boot jpa spring-data-jpa microservices spring-boot-jpa

我正在寻求实现多对一映射类的建议,希望有人能给我提供清晰的图片。

一对一映射场景:表foo和表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 类

@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 存储库中添加此查询吗?

1 个答案:

答案 0 :(得分:1)

您需要确保 FooChildFoo 都被持久化,并且双向关联是同步的(因此在对孩子调用 setFoo(foo) 时还应该添加 {{1 }} 到父级上相应的子级集合)。

因此,在您的情况下,您可能还需要对父级调用 childFoo

(参见关于 cascading operationssynchronizing bidirectional associations 的文档示例)

相关问题