Имя JoinColumn не используется в sql

У меня проблема с сопоставлением отношений «многие к одному» без точного ограничения внешнего ключа, установленного в базе данных. Я использую реализацию 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 не включен ни в одно из утверждений.

Возможно ли иметь отношения, основанные на такой ссылке (на столбец, отличный от первичного ключа, без внешнего ключа в базе данных)? Чего-то еще не хватает?

Заранее спасибо.


person Vladimir    schedule 28.04.2010    source источник
comment
Вы пишете, что LegalEntityId не входит ни в одно из утверждений. Прямо над этим у вас есть утверждение SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId .... LegalEntityId появляется в этом состоянии JOIN. Итак, что вы имеете в виду? Я не понимаю.   -  person Dan LaRocque    schedule 28.04.2010
comment
Извините, я имел в виду, что LegalEntityId не включается в операторы SELECT и INSERT в виде столбца (т.е. INSERT INTO address(..., LegalEntityId) VALUES(...) ).   -  person Vladimir    schedule 29.04.2010
comment
Хорошо спасибо. Не могли бы вы показать определение класса LegalEntity, полностью сгенерированный SQL и код, создающий и затем выполняющий persist() или merge() для сущностей? Кстати, вы были правы, убрав атрибут table="LegalEntity". Этот параметр атрибута заставит столбец LegalEntityId попасть в таблицу LegalEntity. Но вы говорите, что он принадлежит таблице address, что является значением по умолчанию при отсутствии атрибута table.   -  person Dan LaRocque    schedule 30.04.2010


Ответы (1)


Попробуйте изменить свой FetchType на нетерпеливый. OpenJPA не должен запрашивать LegalEntity до тех пор, пока он не будет запрошен вызовом getLegalEntity.

Кроме того, отсутствие ограничений не должно иметь значения (кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь).

person Ryan Johnson    schedule 28.04.2010
comment
Ничего не произошло, все равно выдает тот же sql. - person Vladimir; 28.04.2010