如何指定JPA连接列名?

时间:2013-10-02 18:34:55

标签: java mysql hibernate jpa

有没有人知道如何使用以下简单示例指定特定的列名?

@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',但它可以按要求运行。

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

4 个答案:

答案 0 :(得分:2)

User实体中使用以下注释:

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

答案 1 :(得分:0)

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

用户实体中使用以下注释:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如果Role是@Entity,那么我建议你想在@JoinTable中使用@ManytoMany来拼接连接和反连接列

否则,您可以使用Role Embeddable并使用@ElementCollection,它将为您提供一对一的user_roles表,类似于user_id,role_name。

其中任何一个都会按指定的方式生成架构。