3

我在休眠 4.1.9 中以我喜欢的方式建模外键时遇到了一些问题

我基本上有以下代码:

@Entity
@XmlRootElement
@Table(name="User")
public class UserVO
{
    private String email;

    @Id
    @Column(name="email", unique=true, nullable=false)
    @XmlElement
    public String getEmail()
    {
        return this.email;
    }
}

和这个:

@Entity
@XmlRootElement
@Table(name="Authentification")
public class AuthentificationVO
{
    private String email;
    private UserVO user;

    @Id 
    @Column(name="email", unique=true, nullable=false)
    @XmlElement
    public String getEmail()
    {
        return this.email;
    }

    @OneToOne(cascade = CascadeType.ALL)
    @ForeignKey(name="user_fk")
    public UserVO getUser()
    {
        return this.user;
    }
}

这一切的重点是在两个表中都有一个名为 email 的列,它也应该作为 User 和 Authentification 表的主键。出于某种原因,当我运行它时,Hibernate 坚持要在 Authentification 表中添加一个名为 user_email 的列,但我希望它使用已经存在的名为 email 的列。

我尝试四处寻找解决方案,并尝试使用 mappedBy 注释以及 JoinColumn 来使其正确,但似乎没有任何作用。

4

2 回答 2

2

最后真正的诀窍是添加以下注释:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="email")
@MapsId

我删除了 ForeignKey 注释,因为在创建表时它被忽略了。唯一的影响是约束的命名,它现在由休眠自动生成,我可以忍受。

于 2013-03-09T08:23:02.877 回答
1

对于一对一,您需要@JoinColumn(name="user_fk")为映射指定。注释只是用来覆盖hibernate生成的外键的@ForeignKey名称,而不是告诉hibernate要使用哪个列(这是的作用@JoinColumn

[评论后编辑]

实际上,当您在主键上进行映射时,您应该使用@MapsId注释告诉休眠您正在映射到OneToOne关联实体的 Id。你的映射应该变成:

@OneToOne(CascadeType.ALL)
@ForeignKey(name="email")
@MapsId
于 2013-03-08T20:26:43.653 回答