@AttributeOverride игнорирует неправильные переопределения, это стандарт JPA или гибернации?

#java #hibernate #jpa #hibernate-mapping #hibernate-annotations

#java #гибернация #jpa #отображение гибернации #гибернация-аннотации

Вопрос:

Я заметил, что если у меня есть таблица MYENTITY со столбцами ID_A и ID_B и @Embeddable объект:

 @Embeddable
public class EmbedMe {
    @Column(name="col_a")
    private String a;
    @Column(name="col_b")
    private String b;
    // getters-setters
}
  

И я использую его таким образом в @Entity :

 @Entity
@Table(name="MyEntity")
public class MyEntity {
    @EmbeddedId
    @AttributeOverrides( {
        @AttributeOverride(name = "a", 
                           column = @Column(name = "id_a")), 
        @AttributeOverride(name = "b", 
                           column = @Column(name = "id_b")), 
        @AttributeOverride(name = "inexistingProp", 
                           column = @Column(name = "INEXISTENT_COL")), 
    })
    private EmbedMe embeded;
}
  

Переопределение для inexistingProp игнорируется, вместо того, чтобы выдавать исключение неправильного сопоставления. Я нигде не нашел этого документированного, это поведение JPA? Есть ли какая-либо официальная документация по этому вопросу?


Кроме того, я заметил, что если у @Embeddable уже есть правильное отображение ( "id_a" ) и я меняю @Column в @AttributeOverride с id_a на foo_bar_baz , я получаю эту ошибку:

org.hibernate.Исключение MappingException: не удается найти столбец с логическим именем: ID_A в org.hibernate.mapping.Таблица (MY_SCHEMA.MYENTITY) и связанные с ней супертаблицы и вторичные таблицы

Я бы ожидал, что ошибка будет указывать на то, что столбец FOO_BAR_BAZ не существует, не ID_A . На что он жалуется ID_A ?

ОБНОВЛЕНИЕ: оказалось, что я получал эту ошибку из-за наличия других объектов, связанных с MYENTITY with @ManyToOne , и id_a указанных в @JoinColumns .

Комментарии:

1. Что касается второй проблемы. Вы уверены, что перекомпилировали / перераспределили правильно, потому что, если нет какой-либо ошибки усечения, я не вижу, откуда Hibernate мог бы получить этот ID_A. Попробуйте что-нибудь совершенно другое: foo_bar_baz.

2.Во второй проблеме я кое-что упустил. @Embeddable Действительно указывает правильное имя столбца ( id_a ), и @AttributeOverride переопределяет его на столбец foo_bar_baz сейчас. То же самое. Он выдает эту ошибку id_a .

3. Я думаю, что они просто используют неперекрываемое имя в сообщении об ошибке, и это то, что они подразумевают под «логическим» в «Не удается найти столбец с логическим именем»

4. Моя ошибка — на самом деле были другие объекты, ссылающиеся id_a как referencedcolumname в @JoinColumns. Удаление всех этих результатов в типичном java.sql.SQLException: ORA-00904: "THIS_"."FOO_BAR_BAZ": invalid identifier режиме выполнения, когда выполняется операция с объектом. В любом случае спасибо, @JBNizet. Первая проблема по-прежнему остается для меня загадкой.

5. Я не нашел в спецификации JPA 2.0 какой-либо части, которая заставляла бы поставщика JPA уведомлять о ненадлежащем использовании @AttributeOverride , поэтому я предполагаю, что это решение остается за поставщиком.