У меня проблема с отображением отношения многие-к-одному без точного ограничения внешнего ключа, установленного в базе данных. Я использую реализацию OpenJPA с базой данных MySql, но проблема заключается в сгенерированных сценариях sql для операторов вставки и выбора.
У меня есть таблица LegalEntity, которая содержит столбец RootId (среди прочих). У меня также есть таблица адресов, в которой есть LegalEntityId столбец, который не может иметь значение NULL и который должен содержать значения, ссылающиеся на столбец «RootId» LegalEntity, но без каких-либо ограничений базы данных (внешнего ключа).
Адрес объекта сопоставлен:
@Entity
@Table(name="address")
public class Address implements Serializable {
...
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(referencedColumnName="RootId", name="LegalEntityId", nullable=false, insertable=true, updatable=true, table="LegalEntity")
public LegalEntity getLegalEntity() {
return this.legalEntity;
}
}
Создаются оператор SELECT (при извлечении адресов LegalEntity) и инструкция INSERT:
SELECT t0.Id, .., t0.LEGALENTITY_ID FROM address t0 WHERE t0.LEGALENTITY_ID = ? ORDER BY t0.Id DESC [params=(int) 2]
INSERT INTO address (..., LEGALENTITY_ID) VALUES (..., ?) [params=..., (int) 2]
Если я опускаю атрибут таблицы из упомянутых операторов, генерируются:
SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId WHERE t1.Id = ? ORDER BY t0.Id DESC [params=(int) 2]
INSERT INTO address (...) VALUES (...) [params=...]
Итак, LegalEntityId не включен ни в одно из утверждений.
Можно ли иметь отношения, основанные на такой ссылке (к столбцу, отличному от первичного ключа, без внешнего ключа в базе данных)? Чего-то еще не хватает?
Заранее спасибо.