JPA期望连接表上的ID列

问题描述 投票:0回答:1

我试图用JPA表示联接表,但是生成的SQL期望其中一个表上有一个id字段。

生成的SQL非常接近,但是在Permission表上预期会出现一个ID列,并用作联接表上的FK,我希望不要这样做。请参阅以下架构:

enter image description here

您可以看到我没有在权限表上使用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'

jpa join spring-data-jpa
1个回答
1
投票

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

@ManyToMany
@JoinTable(
        name = "user_permission",
        joinColumns = @JoinColumn(name = "user_id"), 
        inverseJoinColumns = @JoinColumn(name = "permission"))
private List<Permission> permissions;
© www.soinside.com 2019 - 2024. All rights reserved.