使用Spring Hibernate,我试图保存一个实体并获取其ID。保存工作正常,但我没有得到ID返回。标识也未设置到传递给save方法的实体中。我的用户表中的id列是自动增量。
这是我的Java代码:
@Inject
private SessionFactory sessionFactory;
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
public User save(final User user) {
Serializable id = currentSession().save(user);
LOG.info("id: {}, obj id: {}", (Long)id, user.getId());
//outputs "id: 0, obj id: 0"
return user;
}
这是我的休眠xml配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mypackage.user" table="users">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="sequence" />
</id>
<property name="username" type="java.lang.String">
<column name="username"/>
</property>
<property name="password" type="java.lang.String">
<column name="password"/>
</property>
</class>
</hibernate-mapping>
答案 0 :(得分:1)
将id
的生成器更改为identity
,它就会起作用(假设数据库中的id
列为auto_increment
)。 IdentityGenerator期望由数据库中的identity列生成的值,这意味着它们是自动递增的。休眠配置的问题在于,您尝试使用序列生成器而不定义序列。如果您尚未在数据库中定义任何序列,并且您的id
列是自动递增的列,则最好使用identity
生成器,因为Hibernate会获取数据库生成的id
(使用查询来获取最后生成的ID)。
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="identity" /><!--Changed from sequence to identity-->
</id>