jpa - JPA 期望连接表上的 ID 列
问题描述
我试图用 JPA 表示一个连接表,但是生成的 SQL 期望id
其中一个表上有一个字段。
生成的 SQL 非常接近,但是在 Permission 表上出现了一个 ID 列,并用作连接表上的 FK,我希望不要这样做。请参阅下面的架构:
您可以看到我没有在权限表上使用 ID 列,而是让权限的文本表示成为键。
用户.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;
}
权限.java
@Data
@Entity
public class Permission {
@Id
private String permission;
private String permissionName;
private String permissionDescription;
}
生成的 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;
推荐阅读
- javascript - 重构代码以不使用 typeof 作为引用
- python - FileNotFoundError: [Errno 2] 尽管文件确实存在,但没有这样的文件或目录
- visual-studio - Visual Studio 16.0.0 Preview 4.0 中的 10240 SDK 在哪里?
- php - 变量中的变量 - PHP
- azure - 为什么在调用 azure data Lake gen2 的 put 文件 api 时出现缺少标头错误?
- intellij-idea - 在 Webstorm 或 IntelliJ 中集成 Hyperterm
- python - MySQLdb._exceptions.OperationalError ('1046, No database selected') - 烧瓶到 mySQL 连接错误
- c++ - 仅在使用多个标头时 Eclipse C++ 多个主要错误
- asp.net - 如何在不先获取代码的情况下仅使用 ADAL 库获取 userInfo
- c# - BankAccount 不包含“BankAccount”的定义