huiwenshu 2009-07-12 04:33
浏览 160
已采纳

一个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应该怎么做呢!

  • 写回答

5条回答 默认 最新

  • numenZQ 2009-07-14 13:03
    关注
    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]

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料