使用单独的 ID 加入 Table

Join Table with separate id

在我的 spring 引导应用程序中,我有以下示例架构,其中包含两个 table 和一个带有 IdClass 的联接 table:

Company.java

@Entity
@Table(name = "COMPANY")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany
    @LazyCollection(LazyCollectionOption.FALSE)
    @JoinTable(name = "COMPANY_2_LOCATIONS", joinColumns = {@JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID")},
        inverseJoinColumns = {@JoinColumn(name = "LOCATION_ID", referencedColumnName = "ID")})
    private List<Location> locations;
    ...

}

Location.java

@Entity
@Table(name = "LOCATION")
public class Location {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    ...

}

Company2Locations.java

@Entity
@IdClass(Company2LocationsId.class)
@Table(name = "COMPANY_2_LOCATIONS")
public class Comany2Locations {

    @Id
    @ManyToOne
    @JoinColumn(name = "COMPANY_ID")
    @NotNull
    private Company company;

    @Id
    @ManyToOne
    @JoinColumn(name = "LOCATION_ID")
    @NotNull
    private Location location;
    ...
}

Company2LocationsId.java

public class Company2LocationsId{

    private Company company;
    private Location location;
    ...
}

我想为连接添加一个单独的 ID table "Company2Locations" 所以 table 有三列:

我尝试了以下方法来实现这一点:

  1. 添加了一个 ID 并保留了 @IdClass:

Company2Locations.java

@Entity
@IdClass(Company2LocationsId.class)
@Table(name = "COMPANY_2_LOCATIONS")
public class Comany2Locations {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Id
    @ManyToOne
    @JoinColumn(name = "COMPANY_ID")
    @NotNull
    private Company company;

    @Id
    @ManyToOne
    @JoinColumn(name = "LOCATION_ID")
    @NotNull
    private Location location;
    ...
}

这会在我启动应用程序时产生 NullpointerException。

Caused by: java.lang.NullPointerException: null
at org.hibernate.internal.util.StringHelper.root(StringHelper.java:374)
at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1832)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:46)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1775)
at org.hibernate.hql.internal.ast.tree.FromElement.getIdentityColumns(FromElement.java:352)
  1. 添加了 ID 并删除了位置和公司的 @IdClass 和 @Id 注释:

Company2Locations.java

@Entity
@Table(name = "COMPANY_2_LOCATIONS")
public class Comany2Locations {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "COMPANY_ID")
    @NotNull
    private Company company;

    @ManyToOne
    @JoinColumn(name = "LOCATION_ID")
    @NotNull
    private Location location;
    ...
}

现在应用程序启动,我可以向公司添加位置。但是没有生成 id 并且 id 列包含空值。

关于如何将单独的 ID 添加到联接的任何想法 table?

我想这是克里斯作为评论发布的正确答案:

您必须在模型中使用 Comany2Locations(sp) 作为 Company 和 Location 之间的对象,而不是让公司直接引用 Location。在公司内部,它应该是一个使用 mappedby="company"

的 OneToMany