一个hibernate保存对象问题。

我的SSH,用的是orcale,User表的主键ehrid是varchar2类型的,我想实现自动递增功能。
我的做法是:
1.-- Create sequence
create sequence SEHRID
minvalue 44030000000000000000000
maxvalue 999999999999999999999999999
start with 44030000000000000000000
increment by 1
cache 20;
2.通过触发器来产生.
create or replace trigger tehrid
before insert on user
for each row
declare

begin
select sehrid.nextval into:New.ehrid from dual;

end tehrid;

CREATE TABLE "CITIZEN_BASE_INFO" (
EHRID VARCHAR2(23) NOT NULL,
NAME VARCHAR2(20) NOT NULL,
PWD VARCHAR2(20) NOT NULL

}

POJO
测试类
public class UserDaoTest extends BaseDaoTest {
@Autowired
public IUserDao UserDao;
@Test
public void testFindById()
{
try {
User user=new User();
System.out.println(user);
user.setName("hc");
user.setPwd("123");
this.userDao.save(user);
//[color=red] oracle中能查到记录已插入,记录的ehrid有值[/color]
System.out.println(user.getEhrid());
//[color=red]怎么这里打出来的居然是rowid的值哦?[/color]

    } catch (DaoException e) {
    e.printStackTrace();
    }
}

---------------------------接口--------------
public interface IUserDao
{
public void save(User user);
}
---------------------------实现类------------
public class UserDaoImpl extends HibernateDaoSupport implements IUserDao
{
public void save(User user){

    this.getHibernateTemplate().save(user);
    this.log.debug("保存市民信息成功!");

}

}

这里是User.hbm.xml文件











[size=large][size=xx-small]请帮忙解答一下哦,谢谢![/size][/size]
[b]问题补充:[/b]
问题是我的主键是varchar2类型的,可以用sequence嘛?
[b]问题补充:[/b]

我试了,还是不行哦,用sequence,我想是因为我主键JAVA类型是String的,

用触发器的时候和表关联的都提示下面这个错误。
ORA-02291: 违反完整约束条件 (SCOTT.FK_MOBILE_C_RELATIONS_CITIZEN_) - 未找到父项关键字

[b]问题补充:[/b]
User.hbm.xml文件写错了!
应该这样











希望有人能帮我想想办法。我想通过触发器来生成业务ID,这个ID是varchar的
但是我保存对象可以保存进去,就是我想得到刚保存的对象生成的ID应该怎么做呢!

  1. 如果Trigger的目的只是为了取SEQ的值,而没有其他操作,那就可以不用Trigger;
  2. 主键生成策略要用native,这样hibernate就会从默认的hibernate_sequence中取值;
  3. 自己建立hibernate_sequence

[code="sql"]
-- Create sequence
create sequence HIBERNATE_SEQUENCE
minvalue 44030000000000000000000
maxvalue 999999999999999999999999999
start with 44030000000000000000020
increment by 1
cache 20;
[/code]

这样应该就没问题了,你试一下吧。

使用sequence做主键,可以自增

你自己不是建了一个sequence吗,你用sequence做为主键生成策略.试一下,让机器告诉你.




使用缺省策略
针对Oracle数据库的生成方式还是sequence,只不过需要一个特定名字的sequence,"hibernate_sequence"。

oracle自动帮你转换

Statement / PreparedStatement

getGeneratedKeys
ResultSet getGeneratedKeys()
throws SQLException检索由于执行此 Statement 对象而创建的所有自动生成的键。如果此 Statement 对象没有生成任何键,则返回空的 ResultSet 对象。