数据库使用SQL Server2000
使用Hibernate 对一个表 自动生成主键,为自增列.
数据库:
pk pcno int
pasus varchar(1000)
映射文件:
<hibernate-mapping package="hibernate.dao.casus" schema="dbo" catalog="police">
<class name="PCasus" table="P_Casus">
<id name="pcno" type="integer" column="pcno">
<generator class="identity">
</generator>
</id>
<property name="pcasus" length="1000"/>
</class>
</hibernate-mapping>pojo:
public class PCasus implements java.io.Serializable {
private Integer pcno;
private String pcasus;
//get/set方法省略
}
运行以下代码:
public class PCasusDao extends AbstractDao{
public int add(String s){
Session session = this.beginTransaction();
try{
PCasus pc=new PCasus();
pc.setPcasus(s);
session.save(pc);
this.endTransaction(true);
return 0;
}catch(Exception e){
e.printStackTrace();
this.endTransaction(false);
return -9;
}
}
public static void main(String[] arg){
PCasusDao pd=new PCasusDao();
System.out.println(pd.add("asdfasdfasdgaadfasdfasdf"));
}}
出现的问题:
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]无法将 NULL 值插入列 'pcno',表 'police.dbo.P_Casus';该列不允许空值。INSERT 失败。为什么Hibernate没有自动生成主键列?
这个问题应该不复杂,我在Oracle,和mysql中都做过这样的主键自动生成操作,为什么在SQLServer2000中就有问题了列?
大家帮忙看看问题处在那里?
谢谢了~~
使用Hibernate 对一个表 自动生成主键,为自增列.
数据库:
pk pcno int
pasus varchar(1000)
映射文件:
<hibernate-mapping package="hibernate.dao.casus" schema="dbo" catalog="police">
<class name="PCasus" table="P_Casus">
<id name="pcno" type="integer" column="pcno">
<generator class="identity">
</generator>
</id>
<property name="pcasus" length="1000"/>
</class>
</hibernate-mapping>pojo:
public class PCasus implements java.io.Serializable {
private Integer pcno;
private String pcasus;
//get/set方法省略
}
运行以下代码:
public class PCasusDao extends AbstractDao{
public int add(String s){
Session session = this.beginTransaction();
try{
PCasus pc=new PCasus();
pc.setPcasus(s);
session.save(pc);
this.endTransaction(true);
return 0;
}catch(Exception e){
e.printStackTrace();
this.endTransaction(false);
return -9;
}
}
public static void main(String[] arg){
PCasusDao pd=new PCasusDao();
System.out.println(pd.add("asdfasdfasdgaadfasdfasdf"));
}}
出现的问题:
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]无法将 NULL 值插入列 'pcno',表 'police.dbo.P_Casus';该列不允许空值。INSERT 失败。为什么Hibernate没有自动生成主键列?
这个问题应该不复杂,我在Oracle,和mysql中都做过这样的主键自动生成操作,为什么在SQLServer2000中就有问题了列?
大家帮忙看看问题处在那里?
谢谢了~~
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1747)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2149)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:34)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:238)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:158)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:429)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:424)
at hibernate.dao.casus.PCasusDao.add(PCasusDao.java:26)
at hibernate.dao.casus.PCasusDao.main(PCasusDao.java:44)
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]无法将 NULL 值插入列 'pcno',表 'police.dbo.P_Casus';该列不允许空值。INSERT 失败。
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRPCRequest.processReplyToken(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source)
at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.postImplExecute(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.executeInternal(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.execute(Unknown Source)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1717)
... 15 more
要用其它主键生成方式。
<generator class="identity">
</generator>
--------------------------------------
把identity改成increment就可以了.