Спящий режим Много к одному Сопоставление с различным количеством столбцов
Привет, у меня есть 2 таблицы ниже
Table1:
+-------------------+
| ID LOB col1 col2 |
+-------------------+
Первичный ключ (ID и LOB)
Table2:
+-----------------+
| SK ID col3 col4 |
+-----------------+
Первичный ключ (SK)
I нужно дать много одного отношения из таблицы 2 в таблицу1, так как table1 имеет compositePrimaryKey (ID и LOB), но table2 не имеет любого столбца, связанного с LOB. Я не могу предоставить отображение.
Пожалуйста, помогите в этом.
EDIT Я пробовал сопоставление спящего режима для Table2:
<many-to-one name="class1Obj" class="com.acs.enterprise.common.Class1"
lazy="proxy" insert="false" update="false">
<column name="ID" />
<column name="LOB" />
</many-to-one>
Вышеуказанное не работает. При извлечении записи он пытается получить код LOB из таблицы2, который вообще не существует в таблице 1
Ответы
Ответ 1
Предполагая, что table2.SK
является FK до table1.ID
и нет записей table1
, имеющих один и тот же идентификатор, вы можете записать отображение следующим образом:
@ManyToOne
@JoinColumn(name = "ID", insertable = false, updatable = false)
private Class1 class1Obj;
Если есть больше строк table1
с одинаковым идентификатором, сопоставление не будет выполнено, потому что дочерний элемент будет сопоставлен с несколькими родителями.
Итак, для правильной ассоциации many-to-one
вам нужен FK для столбца родителя, который уникален.
Ответ 2
Hibernate @Id
не обязательно должен соответствовать реальному основному ключу базы данных (хотя желательно, чтобы они совпадали, конечно).
Если ID
является уникальным столбцом в Table1
, тогда сопоставьте идентификатор Hibernate только с ним и оставьте LOB
как просто обычное поле.
Если ID
не является уникальным столбцом, то ваше многозначное не будет работать должным образом, потому что в ссылочной таблице будет несколько совпадающих строк.
Ответ 3
@Entity
@Table(name="Table_name")
public class table_name {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "id1", column = @Column(name = "col1")),
@AttributeOverride(name = "id2", column = @Column(name = "col2")) })