繁体   English   中英

Spring 启动 JPA,数据不保存在多对多关系的连接表中

[英]Spring Boot JPA, data do not persist in join table of many-to-many relationship

我需要一些帮助/建议,因为我是 Spring Boot 的新手。 我试图在链接表的帮助下建立多对多关系。 但由于某种原因,我无法将数据保存在链接表中。

以下是实体:

@Table(name = "providers")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor

public class ProviderEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long providerId;

    @OneToMany(mappedBy = "provider", fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<ProviderPractitionersEntity> providerPractitioners; 

    ...
-------------------------------------------------------------
@Entity
@Table(name = "company_practitioner_types")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor

public class CompanyPractitionerTypeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "practitioner", fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<ProviderPractitionersEntity> practitionerProviders;

    ...
}
---------------------------------------------------------------
@Entity
@Table(name = "provider_practitioners")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ProviderPractitionersEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @ManyToOne
    @JsonBackReference
    @JoinColumn(name = "practitioner_id") /*this column is foreign key from practitioner table*/
    private CompanyPractitionerEntity practitioner;

    @ManyToOne
    @JsonBackReference
    @JoinColumn(name = "provider_id") /*this column is foreign key from provider table*/
    private ProviderEntity provider;

    @Column(name = "size")
    private String size;

}

当我持久化新提供者时,我在持久化之前在每个 ProviderPractitioner object 中设置了这个新提供者对象的引用和从业者对象的引用。

因此,来自 List providerPractitioners 的对象具有所有状态的 null 值。 并且没有任何东西被持久化到数据库中的 provider_practitioners 表中。

我试图以这种方式设置多对多关系而不是使用 @ManyToMany 注释的原因是因为 ProviderPractitionerEntity 中的“大小”变量包含一个提供者的一种类型从业者的数量。

我试图为链接表创建 embededId(复合 ID),并得到了相同的结果。

您必须按照您提到的那样创建@EmbeddedId ,然后在ProviderPractitionersEntity子实体(两者都被引用)中添加@MapsId以及复合 id 中的属性名称

首先创建复合id:

@Embeddable
public class ProviderPractitionersId implements Serializable {

   @Column(name = "practitioner_id")
   private Long practitionerId;

   @Column(name = "provider_id")
   private Long providerId;

然后,在多对多实体 map 中,id 和两个实体都是这样:

    @EmbeddedId
    private ProviderPractitionersId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("practitionerId")
    private CompanyPractitionerTypeEntity practitioner;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("providerId")
    private ProviderEntity provider;

因此,正如您所提到的,您可以在ProviderPractitionersEntity中添加任意数量的属性,例如您的size或其他任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM