2012-06-18 4 views
2

Я ищу некоторые советы относительно сопоставления большой старой схемы.Hibernate ManyToOne без внешнего ключа

Прошлая ситуация. Предположим, у нас есть класс, называемый BusinessTransaction. Этот класс имеет несколько полей, ссылающиеся идентификаторы пользователей:

@Entity 
public class BusinessTransaction implements Serializable { 

    private Long id; 
    private User createdBy; 
    private User editedBy; 
    private User cancelledBy; 

    private String department; 
    // etc 

} 

public class User implements Serializable { 
    private Long id; 
    private String department; 
    //etc 
} 

Однако нет ни одного внешних ключей между столом BusinessTransaction и столом пользователя. В SQL пользователь будет подключен к BusinessTransaction через левое внешнее соединение в ключе отдела.

Для создания этих внешних ключей потребуется создание таблиц Join. Наш администратор базы данных не хочет создавать внешние ключи или таблицы соединений и имеет понятные причины для этого (влияет на пакетные сценарии, возможные побочные эффекты на приложение и т. Д.).

Единственной другой идеей, которую я имел, было использование JoinFormula. Однако у @JoinFormula нет лучшей документации, и я понимаю, что данные будут доступны только для чтения.

Я пропустил все, что было бы полезно?

EDIT: добавлен отдел.

Джейсон

+1

Как бизнес-транзакция относится к пользователю в базе данных, если нет FK? Что хранится в таблице бизнес-транзакций для обращения к пользователю? –

+0

Мой плохой. Я отредактировал выше, но в основном есть поле, в котором SQL/HQL-запрос может выполнять левое внешнее соединение. – Jason

+0

«поле, чтобы запрос мог выполнять соединение» - это внешний ключ, но вы говорите, что у вас нет внешнего ключа? Если пользователь идентифицирован отделом, почему бы не назначить отделу первичный ключ пользователя? – meriton

ответ

4

Там нет необходимости создавать ни внешние ключи, ни объединение таблиц, чтобы объявить связь между этой таблицей в Hibernate. Hibernate не проверяет, существуют ли такие внешние ключи (если вы не запрашиваете проверку схемы базы данных).

Но, обратите внимание, что вам нужен правильный индекс в таблице User. Индексы также независимы от внешних ключей, но неспособность их создать приведет к резкому снижению производительности.

Но вы должны отметить, что если не созданы внешние ключи, если ключи в таблице пользователя отсутствуют, вы можете ожидать неопределенного поведения со стороны Hibernate (ошибка). Внешние ключи предназначены для обеспечения согласованности базы данных.

Смежные вопросы