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