Несколько объединений объединений в спящем режиме - PullRequest
0 голосов
/ 07 июля 2011

Мой вопрос связан с дизайном базы данных, а также с тем, как смоделировать этот дизайн в Hibernate.У меня есть две таблицы со следующими первичными ключами:

BLOCK (BLOCK_ID)
BLOCK_SHP (BLOCK_ID, SHAPE_VERSION)

BLOCK to BLOCK_SHP - это отношение один-ко-многим, поскольку у одного блока может быть много разных версионных форм, связанных с ним.Пока все хорошо.

Вторая ассоциация состоит в том, что я также хочу иметь возможность получить текущую форму для Блока.Для этого я добавил еще один атрибут в таблицу BLOCK:

CUR_SHAPE_VERSION

BLOCK_ID и CUR_SHAPE_VERSION теперь формируют внешний ключ для таблицы BLOCK_SHP в BLOCK_ID, SHAPE_VERSION.Каждый блок может иметь 0 или 1 текущих фигур.

В Hibernate я установил эту вторую связь следующим образом:

@OneToOne( cascade = CascadeType.ALL, optional = true )
@NotFound( action = NotFoundAction.IGNORE )
@JoinColumns( {
  @JoinColumn( name = "BLOCK_ID", referencedColumnName = "BLOCK_ID", insertable = false, updatable = false ),
  @JoinColumn( name = "CUR_SHAPE_VERSION", referencedColumnName = "SHAPE_VERSION", insertable = false, updatable = false ) } )
public BlockShape getCurrentShape() {
    return currentShape;
}

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

Это мне не очень приятно, потому что это означает, что Hibernate на самом деле не знает о правильных отношениях между сущностями.,Например, если я запрашиваю currentShape не равен нулю , Hibernate не знает, как правильно выполнить этот запрос - он запрашивает block_id не равен NULL или cur_shape_version не имеет значение .

Так что, думаю, у меня есть несколько вопросов.Во-первых, есть ли лучший способ для моделирования этой второй ассоциации в базе данных?Во-вторых, есть ли лучший способ в Hibernate настроить аннотации для него, чтобы лучше понять взаимосвязь и иметь возможность правильно запрашивать таблицу форм?

Спасибо за любую помощь.

1 Ответ

1 голос
/ 07 июля 2011

Самый простой способ - использовать суррогатный первичный ключ для сущности Shape. Таблицы будут выглядеть так:

BLOCK (BLOCK_ID primary key, CURRENT_SHAPE_ID foreign key references SHAPE.SHAPE_ID)
SHAPE (SHAPE_ID primary key, SHAPE_VERSION, BLOCK_ID foreign key references BLOCK.BLOCK_ID)

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

...