Имя JoinColumn не используется в SQL - PullRequest
1 голос
/ 28 апреля 2010

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

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

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

1 Ответ

0 голосов
/ 28 апреля 2010

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

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

...