JPA / Hibernate:加入列时“缺少列”
我对JPA或Hibernate不太熟悉。 我正在接管其他人的代码而我现在只是想让它工作。 鉴于我的理解有限,我会尽量做到尽可能具体,不要淹没不必要的细节。
我有一个运行时exception“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中的名称”exception。 如果我为第二个@JoinColumn注释切换“name”和“referencedColumnName”属性的值(导致name =“name”,referencedColumnName =“group_name”),我得到exception“org.hibernate.MappingException:Unable to查找具有逻辑名称的列:group_name in group。“
我在网上发现了很多似乎都在做类似事情的例子,但无论出于何种原因,我都无法做到这一点。 为了它的价值,这段代码以前的工作正常,但正如我们所知,这是因为Hibernate被配置为根据需要更新表(因此,“name”列被添加到sessions表中)。 一旦我们将“hbm2ddl.auto”属性更改为“validate”,我们就开始收到此错误。 因此,我认为问题始终存在,我们只是没有注意到它,因为列正在添加。
在此先感谢您的帮助。
referencedColumnName
是外键中引用的group
表中的列。 并且因为您在group
表中具有用作外键的列的实际名称是“ name
”。
以下是有道理的:
@JoinColumn(name = "group_name", referencedColumnName = "name",
因为,然后外键列的名称将是group_name
并且group
表中引用(或用作外键)的列的name
是name
。 但是当你改变它时,它不起作用,因为在你的group
表中没有名为group_name
列。
- 如何将当前日期时间的格式设置为不同的格式?
- 一个行为类似于@Entity和@Embeddable的类
- Spring MVC @ModelAttribute方法返回“Bad request”400
- 如何在Struts 2中显示数据库记录列表(通过Hibernate检索)到JSP页面?
- Spring-boot – 将hibernate映射文件添加到实体管理器
- Hibernate OneToMany java.lang.StackOverflowError
- 将Hibernate 3.5.x添加到maven pom.xml构建中
- Hibernate / persistence有哪些常见问题?
- 如何使用Hibernate逆向工程工具生成或以进行反向关联?