hibernate id生成策略问题

lesaqiu 2014-04-02 03:21:55
一个实体类:
public class MemberSource implements java.io.Serializable {

private String membSourceNo;
private String membSourceName;
private String membSourceDesc;

@Id
// @GeneratedValue
@Column(name = "MembSourceNo", unique = true, nullable = false)
public String getMembSourceNo() {
return this.membSourceNo;
}

public void setMembSourceNo(String membSourceNo) {
this.membSourceNo = membSourceNo;
}


Action:
	MemberSource s1 = new MemberSource();
s1.setMembSourceNo("01");
s1.setMembSourceName("现场");
MemberSource s2 = new MemberSource();
s1.setMembSourceNo("02");
s1.setMembSourceName("网上");


try{
memService.addMemberSource(s1);
memService.addMemberSource(s2);
}catch(Exception e){
e.printStackTrace();
}


DAO:
	public boolean addMemberSource(MemberSource s){
log.debug("saving instance");
try{
this.getHibernateTemplate().save(s);
log.debug("save successfully");
}catch(RuntimeException e){
log.debug("save failed "+e);
throw e;
}
return true;
}


id的GeneratedValue给注释掉了,因为在的话,会报错:
Hibernate: insert into LogisticPark.dbo.MemberSource (MembSourceDesc, MembSourceName) values (?, ?)
org.springframework.dao.DataIntegrityViolationException: could not insert: [com.rokinmementity.MemberSource]; SQL [insert into LogisticPark.dbo.MemberSource (MembSourceDesc, MembSourceName) values (?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.rokinmementity.MemberSource]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:637)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
at com.rokinmemdao.RokinMemberDao.addMemberSource(RokinMemberDao.java:91)

就是 不能将值 NULL 插入列 'MembSourceNo',表 'LogisticPark.dbo.MemberSource';列不允许有 Null 值。INSERT 失败。说明其根本就没有往id里传值,数据库不是自动增长id的。


如果注释掉@GeneratedValue,会报这个错:
Hibernate: insert into LogisticPark.dbo.MemberSource (MembSourceDesc, MembSourceName, MembSourceNo) values (?, ?, ?)
org.springframework.orm.hibernate3.HibernateSystemException: ids for this class must be manually assigned before calling save(): com.rokinmementity.MemberSource; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.rokinmementity.MemberSource
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)


虽然报错了,但id为02的插入进去了,只有一条记录,很不解????
还有hibernate显示的sql语句为什么属性是(MembSourceDesc, MembSourceName, MembSourceNo),就是id的参数去了最后面,跟整个定义时的顺序反了呢??
...全文
95 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
~时光易逝~ 2014-04-03
  • 打赏
  • 举报
回复
你的“01、02”为什么不用常量代替呢,(static final NUM='01';)
lesaqiu 2014-04-02
  • 打赏
  • 举报
回复
太粗心了,刚发帖就看到了
cao_yunfei 2014-04-02
  • 打赏
  • 举报
回复
认真看一下你的action类,中定义的对象。s2 只 new 出来了根本没赋值进去!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧