当前位置: 代码迷 >> Java Web开发 >> hibernate id生成策略有关问题
  详细解决方案

hibernate id生成策略有关问题

热度:1750   发布时间:2016-04-10 22:42:57.0
hibernate id生成策略问题
一个实体类:
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的参数去了最后面,跟整个定义时的顺序反了呢??
------解决方案--------------------
认真看一下你的action类,中定义的对象。s2 只 new 出来了根本没赋值进去!
  相关解决方案