首页 > 解决方案 > 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'

标签: jpajoinspring-data-jpa

解决方案


问题是加入列名。它应该已经映射到映射表 FK 而不是父表 PK。上面的示例已通过此更改修复

@ManyToMany
@JoinTable(
        name = "user_permission",
        joinColumns = @JoinColumn(name = "user_id"), 
        inverseJoinColumns = @JoinColumn(name = "permission"))
private List<Permission> permissions;

推荐阅读