Hibernate: одно и то же сгенерированное значение в двух свойствах - PullRequest
2 голосов
/ 05 мая 2010

Я хочу, чтобы первый был сгенерирован:

@Id
@Column(name = "PRODUCT_ID", unique = true, nullable = false, precision = 12, 
        scale = 0)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PROD_GEN")
@BusinessKey
public Long getAId() {
    return this.aId;
}

Я хочу, чтобы bId изначально был точно таким же, как aId. Один из подходов состоит в том, чтобы вставить сущность, затем получить aId, сгенерированный БД (второй запрос), а затем обновить сущность, установив bId равным aId (третий запрос). Есть ли способ получить bId, чтобы получить то же сгенерированное значение, что и aId?

Обратите внимание, что после этого я хочу иметь возможность обновлять bId из моего графического интерфейса.

Если решение JPA, даже лучше.

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

Выберите свой яд:

Вариант № 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;
}

Опять же, это будет работать, если вам не нужно, чтобы идентификатор сохранялся в базе данных при вставке.

0 голосов
/ 05 мая 2010

Если вы используете JPA, после вставки нового A идентификатор должен быть установлен на сгенерированное значение, я подумал (возможно, это зависит от того, какого провайдера jpa вы используете), поэтому второй запрос не требуется. затем установите bld в значение ald в вашем DAO?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...