#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
, поэтому я предполагаю, что это решение остается за поставщиком.