首页 文章

JPA / Hibernate:加入列时“缺少列”

提问于
浏览
3

我对JPA或Hibernate不太熟悉 . 我正在接管其他人的代码而我现在只是想让它工作 . 鉴于我的理解有限,我会尽量做到尽可能具体,不要淹没不必要的细节 .

我有一个运行时异常“org.hibernate.HibernateException:Missing column:name in public.sessions . ”以下是该部分应用程序的基本组织:

@Entity
@Table(name = "sessions")
public class Session {
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "article_name",
            referencedColumnName = "article_name",
            insertable = false, updatable = false),
        @JoinColumn(name = "group_name",
            referencedColumnName = "name",
            insertable = false, updatable = false) })
    private Group group;

    ...
}

@Entity
@Table(name = "groups")
public class Group {
    ...
}

以下是相关表格 . 模式比这复杂得多(也是不可协商的 - 我不能改变我们现有的基线),但这些是相关的表/列 .

sessions
--------
article_name
group_name
...


groups
--------
article_name
name
...

如您所见,两个表中组名列的名称不同 . 虽然我对JPA知之甚少,但我认为使用“referencedColumnName”属性允许您在连接两个不同名称的列时考虑这种差异 . 但是,使用此代码运行会产生“缺少列:public.sessions中的名称”异常 . 如果我为第二个@JoinColumn注释切换“name”和“referencedColumnName”属性的值(导致name =“name”,referencedColumnName =“group_name”),我得到异常“org.hibernate.MappingException:Unable to查找具有逻辑名称的列:group_name in group . “

我在网上发现了很多似乎在做类似事情的例子,但无论出于何种原因,我都无法做到这一点 . 为了它的 Value ,这段代码以前的工作正常,但正如我们所知,这是因为Hibernate被配置为根据需要更新表(因此,“name”列被添加到sessions表中) . 一旦我们将“hbm2ddl.auto”属性更改为“validate”,我们就开始收到此错误 . 因此,我认为问题始终存在,我们只是没有注意到它,因为列正在添加 .

在此先感谢您的帮助 .

1 回答

  • 1

    referencedColumnName 是外键中引用的 group 表中的列 . 并且因为您在 group 表中具有用作外键的列的实际名称是“ name ” .

    以下是有道理的:

    @JoinColumn(name = "group_name",
                referencedColumnName = "name",
    

    因为,然后外键列的名称将是 group_namegroup 表中引用(或用作外键)的列的名称是 name . 但是当你改变它时,它不起作用,因为在你的 group 表中有 no 列名为 group_name .

相关问题