gpt4 book ai didi

java - JPA/hibernate : "Missing Column" when joining columns

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:40 24 4
gpt4 key购买 nike

我对 JPA 或 Hibernate 不是很熟悉。我正在接管别人的代码,我只是想让它现在就可以工作。鉴于我的理解有限,我将尽量具体化,而不会淹没在不必要的细节中。

我有一个运行时异常“org.hibernate.HibernateException:缺少列: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”属性可以让您在连接两个不同名称的列时考虑到这种差异。但是,使用此代码运行会产生“Missing column: name in public.sessions”异常。如果我为第二个@JoinColumn 注释切换“name”和“referencedColumnName”属性的值(导致 name =“name”,referencedColumnName =“group_name”),我得到异常“org.hibernate.MappingException:无法在组中查找逻辑名称为 group_name 的列。”

我在网络上发现了很多似乎在做类似事情的示例,但无论出于何种原因,我都无法正常工作。对于它的值(value),这段代码过去工作正常,但正如我们发现的那样,这是因为 Hibernate 配置为根据需要更新表(因此,“名称”列被添加到 session 表)。一旦我们将“hbm2ddl.auto”属性更改为“validate”,我们就开始收到此错误。因此,我认为问题一直存在,我们只是没有注意到它,因为正在添加列。

在此先感谢您提供的所有帮助。

最佳答案

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

以下是有道理的:

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

因为,那么外键列的名称将是 group_name 和被引用(或用作外键)的 group 表中的列的名称是名称。但是当你改变它时,它不起作用,因为在你的 group 表中没有名为 group_name列。

关于java - JPA/hibernate : "Missing Column" when joining columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com