使用单独的 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 有三列:
- ID // 单独的id
- COMPANY_ID
- LOCATION_ID
我尝试了以下方法来实现这一点:
- 添加了一个 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)
- 添加了 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
在我的 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 有三列:
- ID // 单独的id
- COMPANY_ID
- LOCATION_ID
我尝试了以下方法来实现这一点:
- 添加了一个 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)
- 添加了 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