我试图用JPA表示联接表,但是生成的SQL期望其中一个表上有一个id
字段。
生成的SQL非常接近,但是在Permission表上预期会出现一个ID列,并用作联接表上的FK,我希望不要这样做。请参阅以下架构:
您可以看到我没有在权限表上使用ID列,而是将权限的文本表示形式作为键。
User.java
@Entity
@Data
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private int accountId;
private String name;
private String email;
private String password;
private boolean admin;
@ManyToMany
@JoinTable(
name = "user_permission",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn(name = "permission"))
private List<Permission> permissions;
}
Permission.java
@Data
@Entity
public class Permission {
@Id
private String permission;
private String permissionName;
private String permissionDescription;
}
Generated SQL
select
permission0_.id as id1_2_0_,
permission0_.permission as permissi2_2_0_,
permission1_.permission as permissi1_0_1_,
permission1_.permission_description as permissi2_0_1_,
permission1_.permission_name as permissi3_0_1_
from user_permission permission0_
inner join permission permission1_ on permission0_.permission=permission1_.permission
where permission0_.id=?
错误
ERROR 15056 --- [tp1962586186-25] o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column 'permission0_.id' in 'field list'
问题是联接列名称。它应该已经映射到映射表FK而不是父表PK。上面的示例已通过此更改修复了
@ManyToMany
@JoinTable(
name = "user_permission",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "permission"))
private List<Permission> permissions;