数据库使用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中就有问题了列?
大家帮忙看看问题处在那里?
谢谢了~~

解决方案 »

  1.   

    SQL Server建表是pcno设置自增了吗?
      

  2.   

    是pcno设置自增.改了native 还是一样.org.hibernate.exception.GenericJDBCException: could not insert: [hibernate.dao.casus.PCasus]
    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
      

  3.   

    native不是由hibernate生成主键,是数据库自己生成主键。
    要用其它主键生成方式。
      

  4.   

    荳肴&#12539;逋&#65405;&#12539;&#12539;諠&#65395;遏&#65381;驕鍋&#65389;疲&#65377;医&#128;ゅ&#128;ゅ&#128;ゅ&#128;ゅ&#128;ゅ&#128;&#12539;縲ゅ&#128;ゅ&#128;ゅ&#128;ゅ&#128;ゅ&#128;ゅ&#128;ゅ&#128;&#12539;遲牙&#65406;&#12539;&#65387;倅&#65402;&#65402;隗&#65379;遲費&#65405;橸&#65405;橸&#65405;橸&#65405;橸&#65405;橸&#65405;橸&#65405;橸&#65405;&#12539;
      

  5.   

    <id name="pcno" type="integer" column="pcno">
                  <generator class="identity">
                  </generator>
    --------------------------------------
    把identity改成increment就可以了.