Java 休眠禁用默认行为

Java 休眠禁用默认行为,java,spring,hibernate,jpa,hibernate-mapping,Java,Spring,Hibernate,Jpa,Hibernate Mapping,我的Hibernate在假设要调用哪些列时遇到了问题 具体来说,当我在@ManyToOne字段中引用另一个表中的列时。 如果我不同时输入@JoinColumn注释,它会在字段名称中映射一个下划线 例如,我有一门课: @Entity public class User extends AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id;

我的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 */
}
发生的情况是,当它尝试获取某个用户的Twitter帐户时,我得到了异常:
MySQLSyntaxErrorException:field list'中的未知列'twitteracc1..userFK_id'

看看它试图将userFK映射到什么:
userFK\u id
。它当然不存在!我没有给它起那个名字

因此,问题归结为:是否可以关闭此功能?(将列名转换为“field\uu'foreignkey”的功能)

我知道使用
@JoinColumn(name=“userFK”)
可以解决这个问题,但我宁愿将其关闭


这是JPA规范指定的默认设置

串联 以下各项之一:名称 引用关系的定义 引用的属性或字段 实体或可嵌入类; ""; 引用对象的名称 主键列。如果没有 这种参照关系 实体中的属性或字段,或 联接用于元素集合, 联接列名为 形成为 以下:实体名称; ""; 引用对象的名称 主键列


在hibernate中,这是在
NamingStrategy
中实现的,在本例中是
EJB3NamingStrategy
。你可以实现你自己的版本,决定你想用什么。但这可能只会使人们变得复杂/困惑(人们可能期望标准适用)

这是JPA规范指定的默认值

串联 以下各项之一:名称 引用关系的定义 引用的属性或字段 实体或可嵌入类; ""; 引用对象的名称 主键列。如果没有 这种参照关系 实体中的属性或字段,或 联接用于元素集合, 联接列名为 形成为 以下:实体名称; ""; 引用对象的名称 主键列


在hibernate中,这是在
NamingStrategy
中实现的,在本例中是
EJB3NamingStrategy
。你可以实现你自己的版本,决定你想用什么。但这可能只会使人们变得复杂/困惑(人们可能期望标准适用)

你好,是的,我知道。但是,如果唯一的解决方案是编写自己的NamingStrategy实现,我宁愿放弃它。再次感谢你!你好,是的,我知道。但是,如果唯一的解决方案是编写自己的NamingStrategy实现,我宁愿放弃它。再次感谢你!
@Entity
public class TwitterAccount extends AbstractEntity {

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

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