У меня проблема с сопоставлением отношений «многие к одному» без точного ограничения внешнего ключа, установленного в базе данных. Я использую реализацию 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 не включен ни в одно из утверждений.
Возможно ли иметь отношения, основанные на такой ссылке (на столбец, отличный от первичного ключа, без внешнего ключа в базе данных)? Чего-то еще не хватает?
Заранее спасибо.
SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...
. LegalEntityId появляется в этом состоянии JOIN. Итак, что вы имеете в виду? Я не понимаю. - person Dan LaRocque   schedule 28.04.2010LegalEntity
, полностью сгенерированный SQL и код, создающий и затем выполняющийpersist()
илиmerge()
для сущностей? Кстати, вы были правы, убрав атрибутtable="LegalEntity"
. Этот параметр атрибута заставит столбец LegalEntityId попасть в таблицу LegalEntity. Но вы говорите, что он принадлежит таблицеaddress
, что является значением по умолчанию при отсутствии атрибутаtable
. - person Dan LaRocque   schedule 30.04.2010