Могу ли я заставить Hibernate заменить объект на основе уникального ограничения столбца?

Я использую Hibernate 4.0.1.Final. У меня есть таблица с уникальным столбцом ограничения...

@Entity
@Table(name = "cb_contract",
    uniqueConstraints = {@UniqueConstraint(columnNames={"ORDER_ID"})}
)
public class Contract {
    ... 
    @Column(name = "ORDER_ID")
    private String orderId;

В настоящее время, если я попытаюсь сохранить два объекта с одинаковым значением для столбца идентификатора заказа, используя метод ниже...

protected void saveOrUpdate(Object obj) {
    final Session session = sessionFactory.getCurrentSession();
    session.saveOrUpdate(obj);
}

Я получаю исключение «org.hibernate.exception.ConstraintViolationException: нарушение ограничения целостности: уникальное ограничение или нарушение индекса» при сохранении второго экземпляра. Есть ли способ заставить Hibernate сохранять или заменять объекты на основе уникального столбца, или мне нужно сначала найти объект, удалить его, если он есть, а затем повторно вставить его?


person Dave    schedule 26.06.2012    source источник


Ответы (1)


Я думаю, вы правы, но самое близкое, что соответствует тому, что вы пытаетесь сделать, задокументировано здесь - Может ли Hibernate работать с синтаксисом MySQL ON DUPLICATE KEY UPDATE?

В зависимости от того, что вы пытаетесь сделать, я был бы обеспокоен тем, что вы были бы рады перезаписать существующую запись, если она с тем же ключом/ограничением уже существует.

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

person Dedawn    schedule 26.06.2012
comment
Что касается синтаксиса DUPLICATE KEY UPDATE, может ли он имитировать синтаксис REPLACE INTO MySQL -- dev.mysql.com/doc/refman/5.0/en/replace.html ? В конце концов, это то, что я хочу сделать. Я попытался поместить инструкцию REPLACE sql в аннотацию @SQLInsert, но получил сообщение об ошибке, в котором говорилось, что Hibernate не распознал токен REPLACE. - person Dave; 27.06.2012
comment
Взгляните на - stackoverflow.com/questions/11235501/ @Dave - person Dedawn; 28.06.2012