2015-07-26 3 views
0

У меня есть ресурс, который необходимо открыть через службу поддержки. Я хочу, чтобы у него было несколько ревизий ресурса (каждый раз, когда он обновляется). У меня есть идентификатор (идентификатор ресурса) и Subid (ревизии) идентификаторHibernate Entity с первичным идентификатором и идентификатором ревизии

id 1 subid 0 
id 1 subid 1 
id 1 subid 2 
id 2 subid 0 

В post here я попытался с идентификатором ресурса автоинкрементного и Subid (увеличивающегося программно на каждом обновлении) Таблица

CREATE TABLE `SomeEntity` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`subid` int(11) NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`,`subid`), 

Entity

private long id; 
private int subid; 

@Id 
@Column(name = "id") 
public long getId() { 
    return id; 
    } 

    @Id 
    @Column(name = "subid") 
    public int getSubid() { 
    return subid; 
    } 

Как и в ответ на связанный пост Одним возможным решением является иметь дополнительный столбец конкатенации идентификатора и Subid, что позволяет Fe tching назначенный идентификатор для создания.

Имеется ли какая-либо информация о создании пользовательского SelectGenerator для достижения инкрементного идентификатора и субада?

Если я дам автоинкремент для id.Что было бы лучшим способом достичь этого?

ответ

0

Я думаю, что вам нужно сделать хак для поддержки этого сценария, так как MySQL (ни JPA) поддерживает это,

хак заключается в следующем: Вам нужна таблица только на колонке автоинкремент и карта это для лица (назовем его SomeEntityIdGenerator). Эта организация предоставит вам поле idSomeEntity.

Затем от SomeEntity вам необходимо сменить составной ключ, чтобы иметь отношение ManyToOne к SomeEntityIdGenerator.

Я не утверждаю, что это довольно (потому что это очень уродливо), но я думаю, что это единственный способ сделать это с помощью простого JAP/SQL. Могут быть альтернативы с использованием триггеров, но вам все равно потребуется дополнительная таблица для работы в качестве sequence.

+0

Я могу добиться аналогичной вещи, имея @EmbeddedId в SomeEntity и используя некоторый код генератора для назначения embeddedId.id в создании и увеличении версии embeddedId.version в update.With этой таблицы вы можете объяснить, как будет идентификатор и версия, назначенная SomeEntity во время создания/обновления? – bl3e

+0

Вам придется обрабатывать версию самостоятельно (возможно, вы можете использовать простые '@ PrePersist' и' @ PreUpdate'. 'SomeEntity.id' будет назначаться автоматически, так как это отношение ManyToOne, поэтому hibernate автоматически назначит идентификатор – Augusto

+0

В методах создания и обновления я использую entitymanager, persist (..). Будет ли он присваивать идентификатор автоматического инкремента только тогда, когда идентификатор отсутствует в объекте, то есть во время создания? Также необходимо проверить, доступен ли назначенный идентификатор в объекте так как мне нужно вернуть назначенный идентификатор в create.As в другом сообщении без @GeneratedValue назначенный идентификатор не был отражен в объекте – bl3e