2010-10-28 19 views
7

Chcę zapisać niektóre obiekty do bazy danych z predefiniowanymi identyfikatorami przy użyciu trybu hibernacji. Czy można to zrobić za pomocą metody zapisu sesji Hibernate?Zapisz nowy obiekt przy użyciu Hibernate za pomocą dostarczonego identyfikatora

wiem, że istnieją następujące rozwiązania:

1) wykonać SQL skrypt z niezbędnych deklaracji należy wpisać:

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

2) użyć zapytania SQL w Hibernacja:

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; 
    } 
} 

Ale: czy można to zrobić bez SQLQuery?

W hibernacji odniesienia w sekcji 11.2. Making objects persistent jest przykład kodu:

Alternatywnie, można przypisać identyfikator stosując przeciążony wersję Save().

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)); 

Ale nie mogłem znaleźć przykład, jak to zrobić.

Czy możliwe jest zapisywanie nowych obiektów z podanymi ID do bazy danych przy użyciu Hibernate bez użycia zapytania SQL? Jeśli tak, to w jaki sposób? A jak przeciążać metodę sesji save() jak wspomniano w odwołaniu do Hibernacji?

Dzięki!

Odpowiedz

4

Dokumentacja prosi, aby nie zastąpić save samemu, ale użyć wariantu save, który pobiera dwa argumenty. Więcej informacji można znaleźć w [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

Nie zapomnij, aby nie używać generatorów identyfikacyjnych przy użyciu dwie argumentów ' save' –

+1

Eh, prawy link to: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/classic/Session.html#save(java.lang.Object, java.io. Serializable) – iryndin

+2

Jedyny wariant 'Save()' przy użyciu dwóch argumentów przyjmuje ciąg, a następnie sam obiekt ... nie klucz. – Nyerguds

4

Zastosowanie session.replicate

YourEntity entity = // .. 
entity.setId(yourId); 
entity.setBar(bar); 
//.. 
session.replicate(entity,ReplicationMode.EXCEPTION); 
1

określić assigned jako generator w kolumnie ID.

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

Należy pamiętać, że do tego, aby dobrze wykonać, to pomaga na wersja zerowalne właściwość. Hibernacja następnie traktuje wartości "null" jako niezapisane.

<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); 
} 

Mam nadzieję, że to pomoże.

0

Na razie replicate(Object object, ReplicationMode replicationMode) wydaje się być dopuszczalnym i preferowanym sposobem. Możesz grać trochę z różnymi wartościami dla ReplicationMode, aby dopasować się do twoich potrzeb.

Powiązane problemy