Выберите свой яд:
Вариант № 1
Вы можете аннотировать bId
как org.hibernate.annotations.Generated
и использовать триггер базы данных при вставке (я предполагаю, что nextval
уже назначен для AID, поэтому мы присвоим curval
для BID):
CREATE OR REPLACE TRIGGER "MY_TRIGGER"
before insert on "MYENTITY"
for each row
begin
select "MYENTITY_SEQ".curval into :NEW.BID from dual;
end;
Я не большой поклонник триггеров и событий, происходящих за сценой, но это, кажется, самый простой вариант (хотя и не лучший для переносимости).
Вариант № 2
Создайте новую сущность, сохраните ее, очистите менеджер сущностей, чтобы получить назначенный идентификатор, установите aId
на bId
, объедините сущность.
em.getTransaction().begin();
MyEntity e = new MyEntity();
...
em.persist(e);
em.flush();
e.setBId(e.getAId());
em.merge(e);
...
em.getTransaction().commit();
Ужасно, но работает.
Вариант № 3
Используйте аннотации обратного вызова для установки bId
в памяти (до тех пор, пока он не будет записан в базу данных):
@PostPersist
@PostLoad
public void initialiazeBId() {
if (this.bId == null) {
this.bId = aId;
}
}
Это должно работать, если вам не нужно, чтобы идентификатор был записан на вставке (но в этом случае см. Вариант № 4).
Вариант № 4
Вы могли бы фактически добавить некоторую логику в метод получения bId
вместо использования обратных вызовов:
public Long getBId() {
if (this.bId == null) {
return this.aId;
}
return this.bId;
}
Опять же, это будет работать, если вам не нужно, чтобы идентификатор сохранялся в базе данных при вставке.