【问题标题】:Hibernate disable default behaviour休眠禁用默认行为
【发布时间】:2013-12-19 12:06:23
【问题描述】:

我的 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") 可以解决这个问题,但我宁愿将其关闭。

问候

【问题讨论】:

    标签: java spring hibernate jpa hibernate-mapping


    【解决方案1】:

    这是 JPA 规范指定的默认值

    串联 以下内容:名称 参照关系 引用的属性或字段 实体或可嵌入类; "";被引用的名称 主键列。如果没有 这样的参照关系 实体中的属性或字段,或者如果 连接用于元素集合, 连接列名称是 形成为的串联 以下:实体名称; "";被引用的名称 主键列。

    在休眠中,这是在NamingStrategy 中实现的,在这种情况下是EJB3NamingStrategy。你可以实现你自己的版本来决定你想使用什么。但这可能只会使人们复杂化/混淆(可能期望标准适用)。

    【讨论】:

    • 您好,是的,我知道这一点。但是,如果唯一的解决方案是编写自己的 NamingStrategy 实现,我宁愿保留它。再次感谢您!
    猜你喜欢
    • 2013-07-26
    • 2017-06-13
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2012-05-24
    • 2015-09-24
    相关资源
    最近更新 更多