Hibernate禁用默认行为

时间:2013-12-03 12:20:59

标签: java spring hibernate jpa hibernate-mapping

我的Hibernate对于调用列的内容做了一些假设。

具体来说,当我执行@ManyToOne字段时,我引用另一个表中的列。 会发生的是,如果我也没有输入@JoinColumn注释,它会在字段中用下划线映射它的名称。

例如,我有这个课程:

@Entity
public class User extends AbstractEntity {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int id;

     private String username;
     private String password;

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "userFK")
     private List<TwitterAccount> twitterAccounts;

     /* GETTERS & SETTERS OMITTED */
}

然后我有TwitterAccount类:

@Entity
public class TwitterAccount extends AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    private User userFK;
}

当它试图获取特定用户的Twitter帐户时会发生异常:MySQLSyntaxErrorException: Unknown column 'twitteracc1_.userFK_id' in 'field list'

查看它尝试将userFK映射到:userFK_id的内容。当然它不存在!我没有给它那个名字。

所以问题归结为:是否可以关闭此功能?(将列名称转换为'field_'foreignkey'的功能)

我知道使用@JoinColumn(name = "userFK")会解决它,但我宁愿将其关闭。

此致

1 个答案:

答案 0 :(得分:1)

这是JPA规范

指定的默认值
  

连接   以下内容:名称   引用关系   参考的属性或字段   实体或可嵌入的类;   “”;引用的名称   主键列。如果没有   这种引用关系   实体中的财产或领域,或者如果   连接用于元素集合,   连接列名称是   形成的连接形式   以下:实体名称;   “”;引用的名称   主键列。

在休眠中,这是在NamingStrategy中实现的EJB3NamingStrategy。你可以实现你自己的决定你想要使用的版本。但这可能只会使人们感到困惑/混淆(可能希望标准适用)。