Java 使用提供的ID使用Hibernate保存新对象

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

我想使用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 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);
}