【问题标题】:org.hibernate.MappingException Unable to find column with logical name annotation getterorg.hibernate.MappingException 找不到具有逻辑名称注释 getter 的列
【发布时间】:2023-04-04 11:58:01
【问题描述】:

我有很多类的注释放在 getter 上方,如下所示:

private Location location;

@ManyToOne(fetch = FetchType.LAZY)
@NotNull
@JoinColumn(name = "LocationId", nullable = false)
public Location getLocation() {
    return location;
}

该代码适用于 hibernate \ dto 架构,但我正在尝试实现 Spring Data 并且我没有对代码进行任何更改,我只是在依赖项中添加了 spring-data 并且我开始收到错误:

Caused by: org.hibernate.MappingException: Unable to find column with logical name locationid in table LocationProperty
    at org.hibernate.cfg.Configuration$MappingsImpl.getPhysicalColumnName(Configuration.java:2949)
    at org.hibernate.cfg.IndexOrUniqueKeySecondPass.addConstraintToColumn(IndexOrUniqueKeySecondPass.java:86)
    at org.hibernate.cfg.IndexOrUniqueKeySecondPass.doSecondPass(IndexOrUniqueKeySecondPass.java:76)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1597)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1741)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1792)

可以通过将注释从 getter 移动到字段声明来解决,所以这段代码可以正常工作:

@ManyToOne(fetch = FetchType.LAZY)
@NotNull
@JoinColumn(name = "LocationId", nullable = false)
private Location location;


public Location getLocation() {
    return location;
}

Spring-data 是 1.3.0.RELEASE,我知道它已经很老了,但是在这个项目中我们使用的是旧的休眠,所以我不能添加新的,因为我在会话工厂等方面遇到了大量的错误。所以这不是一个选项。

休眠是 4.1.12.final

我可以通过移动注释来解决这个问题,但是有数百个类,所以这真的是个假工作。

【问题讨论】:

  • 这个错误告诉你LocationProperty表上没有名为locationid的列。
  • @sovannarithcheav 真的吗?为什么上面的代码有效? (提示:bc 有这样的专栏)

标签: java spring hibernate orm annotations


【解决方案1】:

默认情况下,JPA 访问实体属性的值并使用实体的属性 getter 和 setter 方法将这些值映射到数据库列。

您可以将这些属性注释放在私有属性或公共 getter 方法上。

如果您使用 AccessType.PROPERTY(默认)并注释私有属性而不是 JavaBean getter,则字段名称必须与属性名称匹配。但是,如果您对 JavaBean getter 进行注释,则名称不必匹配。

如果您使用 AccessType.FIELD 并注释 getter 而不是属性,则字段名称还必须与 JavaBean 属性名称匹配。在这种情况下,如果您对属性进行注释,它们不必匹配。

您可以使用@javax.persistence.Access 注释更改此设置

您可以参考here

【讨论】:

  • 谢谢,这是一个答案
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2021-01-30
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多