org.hibernate.MappingException Невозможно найти столбец с получателем аннотации логического имени - PullRequest
0 голосов
/ 02 октября 2018

У меня есть много классов, где над геттером размещены аннотации, подобные этому:

private Location location;

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

Этот код работал с архитектурой hibernate \ dto, но я пытаюсь реализовать Spring Data и не вносил никаких измененийв коде я просто добавил данные Spring в зависимости и начинаю получать ошибку:

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)

Это можно исправить, переместив аннотации из объявления получателя в поле, поэтому этот код работает:

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


public Location getLocation() {
    return location;
}

Spring-data - 1.3.0. РЕЛИЗ, я знаю, что он очень старый, НО в этом проекте мы используем старый hibernate, поэтому я не могу добавить более новый, потому что я получил огромное количество других ошибок с фабрикой сессий и т. Д.Так что это не вариант.

Hibernate - 4.1.12.final

Я могу исправить это, переместив аннотации, но есть сотни классов, так что это действительно фиктивная работа.

1 Ответ

0 голосов
/ 02 октября 2018

По умолчанию JPA получает доступ к значениям свойств сущности и сопоставляет их со столбцами базы данных, используя методы получения и установки свойств сущности.

Вы можете размещать аннотации этих свойств либо в частных свойствах, либо в открытых методах получения..

Если вы используете AccessType.PROPERTY (по умолчанию) и аннотируете частные свойства вместо методов получения JavaBean, имена полей должны совпадать с именами свойств.Однако имена не обязательно должны совпадать, если вы аннотируете геттеры JavaBean.

Если вы используете AccessType.FIELD и аннотируете геттеры вместо свойств, имена полей также должны совпадать с именами свойств JavaBean.В этом случае они не должны совпадать, если вы аннотируете свойства.

Вы можете изменить это, используя @javax.persistence.Access аннотацию

Вы можете сослаться здесь

...