2010-10-28 79 views
7

我想使用Hibernate將一些對象保存到具有預定義ID的數據庫。使用Hibernate會話的保存方法可以做到嗎?使用提供的ID保存新對象與休眠使用提供的ID

我知道的有以下解決方法:

1)執行SQL腳本需要插入語句:

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

2)使用SQL查詢在休眠:

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?

在節11.2. Making objects persistent Hibernate參考有例子的代碼:

或者,也可以使用保存的一個重載 版本分配 標識符()。

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

但我找不到例子如何做到這一點。

那麼,是否有可能保存新的對象與提供的ID到數據庫與Hibernate不使用SQL查詢?如果是,那麼如何? 如何在Hibernate參考中提到的超載會話方法save()?

謝謝!

回答

4

本文檔要求您自己不要覆蓋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

使用兩個論點時不要忘記不使用ID發電機'保存' – 2010-10-28 21:16:46

+1

呃,正確的鏈接是:http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/classic/Session.html#save(java.lang.Object,java.io.可序列化) – iryndin 2010-10-28 21:32:26

+2

使用兩個參數的'Save()'的唯一變體需要一個字符串,然後該對象本身...不是一個鍵。 – Nyerguds 2015-09-02 08:31:33

4

使用session.replicate

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

指定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

現在replicate(Object object, ReplicationMode replicationMode)似乎是一個可以接受的和首選的方式。您可能需要針對ReplicationMode使用不同的值以適應您的需求。