2010-10-28 46 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使用不同的值以适应您的需求。