Сохранить новый объект в Hibernate, используя предоставленный идентификатор - PullRequest
7 голосов
/ 29 октября 2010

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

Я знаю, что есть следующие обходные пути:

1) выполнить скрипт SQL с необходимыми инструкциями вставки:

insert into MyObj(id,name) values (100,'aaa'), (101,'bbb');

2) использовать SQL-запрос в Hibernate:

public static boolean createObj(Long id, String name) {
  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  if (session.get(MyObj.class, id) == null) {        
    session.beginTransaction();
    SQLQuery sqlQuery = session.createSQLQuery
      ("insert into myobj(id,name) values(?,?)");
    sqlQuery.setLong(0, id);
    sqlQuery.setString(1, name);
    sqlQuery.executeUpdate();
    session.getTransaction().commit();
    return true;
  } else {
    return false;
  }
}

Но: можно ли обойтись без SQLQuery?

В справке Hibernate в разделе 11.2. Делаем объекты постоянными есть пример кода:

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

DomesticCat pk = new DomesticCat();
pk.setColor(Color.TABBY);
pk.setSex('F');
pk.setName("PK");
pk.setKittens( new HashSet() );
pk.addKitten(fritz);
sess.save( pk, new Long(1234) );

Но я не смог найти пример того, как это сделать.

Итак, возможно ли сохранить новые объекты с предоставленными идентификаторами в базе данных с помощью Hibernate, не используя SQL-запрос? Если да, то как? А как перегрузить метод сеанса save (), как упомянуто в справочнике Hibernate?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 06 мая 2013

Использовать session.replicate

YourEntity entity = // ..
entity.setId(yourId);
entity.setBar(bar);
//..
session.replicate(entity,ReplicationMode.EXCEPTION);
4 голосов
/ 29 октября 2010

Документация просит не переопределять save самостоятельно, а использовать вариант save, который принимает два аргумента См. [JavaDocs] [1] для более подробной информации.

YourEntity entity = // ..
entity.setFoo(foo);
entity.setBar(bar);
//..
session.save(entity, theIDYouWantToUse);

[1]: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#save(java.lang.String, java.lang.Object)

1 голос
/ 06 мая 2013

Укажите assigned в качестве генератора в столбце ID.

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-id-generator

Обратите внимание, что для правильной работы полезно иметь свойство версии с нулевым значением * .Hibernate тогда обрабатывает 'нулевые' значения версии как несохраненные.

<id name="id" type="int">
    <generator class="assigned" />
</id>
<version name="version" type="int">

public class Person {
    // ID;    assigned, SPEC.
    public int getId();
    public void setId (int id);
    // Version;  NOTE -- must be nullable!
    public Integer getVersion();
    public void setVersion (Integer version);
}

Надеюсь, это поможет.

0 голосов
/ 22 января 2017

Используйте метод сохранения hibernate: - save (String entityName, Object object) Для получения дополнительной информации любезно следуйте: - http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#save(java.lang.String, java.lang.Object)

Примечание: - Не используйте GeneratedValueлюбого типа выше вашего Первичного ключа @GeneratedValue (стратегии = GenerationType.IDENTITY)

0 голосов
/ 26 июня 2014

На данный момент replicate(Object object, ReplicationMode replicationMode) представляется приемлемым и предпочтительным способом.Возможно, вы захотите немного поиграть с разными значениями ReplicationMode, чтобы удовлетворить ваши потребности.

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