Java 使用提供的ID使用Hibernate保存新对象
我想使用Hibernate将一些对象保存到具有预定义ID的数据库中。是否可以使用Hibernate会话的save方法执行此操作 我知道有以下解决办法: 1) 使用必要的insert语句执行SQL脚本:Java 使用提供的ID使用Hibernate保存新对象,java,hibernate,session,Java,Hibernate,Session,我想使用Hibernate将一些对象保存到具有预定义ID的数据库中。是否可以使用Hibernate会话的save方法执行此操作 我知道有以下解决办法: 1) 使用必要的insert语句执行SQL脚本: insert into MyObj(id,name) values (100,'aaa'), (101,'bbb'); 2) 在Hibernate中使用SQL查询: public static boolean createObj(Long id, String name) { Session
insert into MyObj(id,name) values (100,'aaa'), (101,'bbb');
2) 在Hibernate中使用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可以吗
在第节的Hibernate参考中,有一个代码示例:
或者,您可以指定
使用重载版本的标识符
save()的名称
但我找不到如何做到这一点的例子
所以,是否可以使用Hibernate而不使用SQL查询将带有提供ID的新对象保存到数据库中?如果是,那怎么办?
以及如何重载Hibernate参考中提到的会话方法save()
谢谢 文档要求您不要覆盖
save
您自己,而是使用带有两个参数的save
变量。有关更多详细信息,请参阅[JavaDocs][1]
YourEntity entity = // ..
entity.setFoo(foo);
entity.setBar(bar);
//..
session.save(entity, theIDYouWantToUse);
[1] :,java.lang.Object)使用session.replicate
YourEntity entity = // ..
entity.setId(yourId);
entity.setBar(bar);
//..
session.replicate(entity,ReplicationMode.EXCEPTION);
在ID列上指定
assigned
作为生成器
请注意,要使其性能良好,有一个可为null的version属性是有帮助的。然后Hibernate将“null”版本值视为未保存
<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);
}
公共阶层人士{
//ID;已分配,规范。
public int getId();
公共无效设置id(内部id);
//版本;注意--必须为空!
公共整数getVersion();
公共版本(整数版本);
}
希望这能有所帮助。目前
复制(Object-Object,ReplicationMode-ReplicationMode)
似乎是一种可以接受的首选方式。为了满足您的需要,您可能需要对复制模式的不同值进行一些调整。使用hibernate的保存方法:-
保存(字符串entityName,对象)
有关更多信息,请参见:-
,java.lang.Object)
注意:-不要在主键的上面使用任何类型的GeneratedValue
@GeneratedValue(strategy=GenerationType.IDENTITY)当使用两个参数
save
Eh时,不要忘记不要使用ID生成器,正确的链接是:,java.io.Serializable)使用两个参数的save()
的唯一变体是字符串,然后对象本身。。。不是键。@Nyerguds在3.6Javadocs中,我仍然看到上面提到的方法:是的,但它是一个接口,在一个单独的名称空间中(即,org.hibernate.classic
)。我不确定这有什么用处,因为它根本不在我得到的会话对象中。。
<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);
}