【问题标题】:How to specify JPA join column names?如何指定 JPA 连接列名?
【发布时间】:2013-10-02 18:34:55
【问题描述】:

有谁知道如何通过以下简单示例指定特定的列名?

@Entity
public class Role {
    @Id
    @GeneratedValue
    @Column(name="id")
    private final Integer id;

    ...
}

@Entity
public class User {
    @Id
    @GeneratedValue
    @Column(name="id")
    private final Long id;

    @ElementCollection
    @CollectionTable(name = "user_roles" joinColumns = { @JoinColumn(name = "user_id")})
    private final Set<Role> roles;

    ...
}

这令人沮丧地产生了一个名为“user_roles”的表和字段名称:“user_id”和“roles_id”。

为什么是“roles_id”而不是“role_id”,如何将其更改为“role_id”?

值得我使用 JPA 2.0、MySQL 和 Hibernate。我要添加的数据是正确添加的,所以这只是一个口味问题。

编辑:

以下可能有点 JPA 1.0'ish,但它可以根据需要工作。

@ManyToMany
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))

【问题讨论】:

    标签: java mysql hibernate jpa


    【解决方案1】:

    User Entity 中使用以下注解:

    @ElementCollection
    @CollectionTable(name = "user_roles")
    @Column(name = "role_id")
    private Set<Role> roles;
    

    【讨论】:

    • 谢谢,我也试过了,但没有任何改变。不幸的是,它仍然使用“roles_id”。 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“roles_id”
    • 您使用的是什么 JPA 版本?
    • 如果你从 java 代码生成模式,那么使用 drop-and-create 生成类型或手动删除表。
    • JPA 2.0 版 (hibernate-jpa-2.0-api-1.0.1.Final.jar)
    • 当我在 persistence.xml 中指定 hibernate.hbm2ddl.auto=create 作为属性时,我得到了为我创建的下表: CREATE TABLE user_roles (user_id bigint(20) NOT NULL, roles_id int(11) NOT NULL, 唯一键 UK_amwlmdeik2qdnksxgd566knop (roles_id), 键 FK_amwlmdeik2qdnksxgd566knop (roles_id), 键 FK_g1uebn6mqk9qiaw45vnacmyo2 (user_id), 约束 FK_g1uebn6mqk9qiaw45vnacmyo2754398643 键@) 引用 user (id),约束 FK_amwlmdeik2qdnksxgd566knop 外键 (roles_id) 引用 role (id) ) ENGINE=InnoDB 默认字符集=latin1
    【解决方案2】:

    来自休眠参考: http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/

    在您的 User 实体中使用以下注释:

    @ElementCollection
    @CollectionTable(name="user_roles", joinColumns=@JoinColumn(name="user_id"))
    @Column(name="role_id")
    public Set<Role> getRoles() { ... } 
    

    【讨论】:

    • 谢谢,会检查的。与上面的唯一区别是注释在“getter”上(假设我们已经添加了 @Column 部分,不幸的是它没有改变)。
    【解决方案3】:

    我认为问题在于@ElementCollection。它似乎更适合简单的类型。我将坚持使用在我对问题的编辑中指定的 @ManyToMany 注释。看来这个话题之前已经以另一种方式解决了:Difference between @OneToMany and @ElementCollection?

    【讨论】:

      【解决方案4】:

      您的映射错误。 Role 是一个实体,但 @ElementCollection 应该与基本类型或 Embeddables 一起使用。

      如果 Role 是 @Entity,那么我建议您使用 @ManytoMany 并在 @JoinTable 指定连接和反向连接列

      否则,您可以使角色可嵌入并使用 @ElementCollection,这将为您提供一对多的 user_roles 表,例如 user_id、role_name。

      其中任何一个都将生成您指定的架构。

      【讨论】:

      • 谢谢,我已经在上面的回答中得出了这个结论。
      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2022-07-07
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2018-09-08
      相关资源
      最近更新 更多