简单的用hibernate中的save()方法向表中插入一条数据,数据4个字段,其中id为自增长,workname字段是我从表单获取过来的内容,其他两个str1,str2库中设置可为空,所以暂时不添加,这个save()方法我怎么用都写不对,尤其Id这里,我写上setId()就报错:不能添加显性数据什么的,不写的话又提示null字段错误,很郁闷,原来做的都是读取今天做个添加怎么都写不出来,帮帮忙大家:
action代码:public class Addwork extends Action {
public ActionForward execute (ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
{
try{
request.setCharacterEncoding("gb2312");
String workname = request.getParameter("workname");

if(!workname.equals("") && !workname.isEmpty())
{
List temp = new WorkNameDAO().findbyname(workname);
if(temp.size()>=1)
{
return mapping.findForward("err");
}
else
{

/*SaveForm saveForm = (SaveForm) form;
Transaction tx=WorkNameDAO.getSessionFactory().openSession().beginTransaction(); 
WorkName article=new WorkName();
article.setTitle(saveForm.getTitle());
article.setContent(saveForm.getContext());
WorkNameDAO.save(article);
tx.commit();
return mapping.findForward("success");*/


HibernateSessionFactory.getSessionFactory().openSession();
WorkName wkname = new WorkName();
wkname.setWorkname(workname);
wkname.setBewrite("");
wkname.setWkprincipal("");
WorkNameDAO um = new WorkNameDAO();
um.save(wkname);
HibernateSessionFactory.getSessionFactory().close();
return mapping.findForward("addsecc");
}
}
else
return mapping.findForward("err");
}
catch(UnsupportedEncodingException e){
return mapping.findForward("logonerr");
}
}
}
MyEclipse自动生成的DAO文件代码:
public void save(WorkName transientInstance) {
log.debug("saving WorkName instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}

解决方案 »

  1.   

    表映射的类文件:
    package com.pro.entity;/**
     * WorkName entity.
     * 
     * @author MyEclipse Persistence Tools
     */public class WorkName implements java.io.Serializable { // Fields private String workname;
    private Integer id;
    private String bewrite;
    private String wkprincipal; // Constructors /** default constructor */
    public WorkName() {
    } /** minimal constructor */
    public WorkName(Integer id) {
    this.id = id;
    } /** full constructor */
    public WorkName(Integer id, String bewrite, String wkprincipal) {
    this.id = id;
    this.bewrite = bewrite;
    this.wkprincipal = wkprincipal;
    } // Property accessors public String getWorkname() {
    return this.workname;
    } public void setWorkname(String workname) {
    this.workname = workname;
    } public Integer getId() {
    return this.id;
    } public void setId(Integer id) {
    this.id = id;
    } public String getBewrite() {
    return this.bewrite;
    } public void setBewrite(String bewrite) {
    this.bewrite = bewrite;
    } public String getWkprincipal() {
    return this.wkprincipal;
    } public void setWkprincipal(String wkprincipal) {
    this.wkprincipal = wkprincipal;
    }}
      

  2.   

    浪费大家点时间看看~action中的else{}里面的代码是我做的调用save()方法插入部分,但是一直有错误,怎么改都不行。需要看什么代码。大家说说我贴出来,上午弄了一上午了,很郁闷。
      

  3.   

    你还少放了一个文件吧.hbm.xml这才是关键的文件
      

  4.   

    写上setid();后报这个错:
    Hibernate: 
        select
            workname0_.workname as workname3_,
            workname0_.id as id3_,
            workname0_.bewrite as bewrite3_,
            workname0_.wkprincipal as wkprinci4_3_ 
        from
            ProblemSys.dbo.WorkName workname0_ 
        where
            workname0_.workname='义洛矿'
    Hibernate: 
        insert 
        into
            ProblemSys.dbo.WorkName
            (id, bewrite, wkprincipal) 
        values
            (?, ?, ?) select
                scope_identity()
    2010-1-21 14:59:29 org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet action threw exception
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'WorkName' 中的标识列插入显式值。
    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.id.IdentityGenerator$InsertSelectDelegate.executeAndExtract(IdentityGenerator.java:108)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
    at com.pro.entity.WorkNameDAO.save(WorkNameDAO.java:33)
    at com.pro.action.Addwork.execute(Addwork.java:56)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
      

  5.   

    ID自动增长,在*.hbm.xml中要设置其增长方式。
      

  6.   

    WorkName.hbm.xml代码:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.pro.entity.WorkName" table="WorkName" schema="dbo" catalog="ProblemSys">
            <id name="workname" type="java.lang.String">
                <column name="workname" length="50" />
                <generator class="native"></generator>
            </id>
            <property name="id" type="java.lang.Integer">
                <column name="id" not-null="true" />
            </property>
            <property name="bewrite" type="java.lang.String">
                <column name="bewrite" length="50" />
            </property>
            <property name="wkprincipal" type="java.lang.String">
                <column name="wkprincipal" length="50" />
            </property>
        </class>
    </hibernate-mapping>
      

  7.   


     <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="native" />
            </id>
      

  8.   

    而且hibernate.cfg.xml里面我也添加了:
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration><session-factory>
    <property name="connection.username">sa</property>
    <property name="connection.url">
    jdbc:microsoft:sqlserver://localhost:1433
    </property>
    <property name="dialect">
    org.hibernate.dialect.SQLServerDialect
    </property>
    <property name="myeclipse.connection.profile">Problem</property>
    <property name="connection.driver_class">
    com.microsoft.jdbc.sqlserver.SQLServerDriver
    </property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="connection.password"></property>
    <mapping resource="com/pro/entity/Usertable.hbm.xml" />
    <mapping resource="com/pro/entity/Problem.hbm.xml" />
    <mapping resource="com/pro/entity/ProType.hbm.xml" />
    <mapping resource="com/pro/entity/WorkName.hbm.xml" /></session-factory></hibernate-configuration>
      

  9.   

    workname字段是主键,id自动增长,其他两个字段设置允许为空
      

  10.   


    <hibernate-mapping>
        <class name="com.pro.entity.WorkName" table="WorkName" schema="dbo" catalog="ProblemSys">
            <id name="id" type="java.lang.Integer">
                       <column name="id" />
                       <generator class="native"></generator>
            </id>
            <property name="workname" type="java.lang.String">
                <column name="workname" length="50" not-null="true" />
            </property>
            <property name="bewrite" type="java.lang.String">
                <column name="bewrite" length="50" />
            </property>
            <property name="wkprincipal" type="java.lang.String">
                <column name="wkprincipal" length="50" />
            </property>
        </class>
    </hibernate-mapping>
      

  11.   

    啊.......String的<generator class="native">可以这样吗?String的需要assign吧?
      

  12.   

    native不是通用的吗,试试再说好了
      

  13.   

    你的表有自增长主见吗? 你的映射文件和 类 都没有啊, 你还是重新建表 重新映射一下表把我看你见表的时候就弄错了。 搞的映射完了workname 变成主见自增长    一直添加就一直有错如果你的描述  ID逐渐  workname 内容的话  你的映射类的构造方法也有错误建议重新见表  重新映射   这个最简单
      

  14.   

    啊?WorkName.hbm.xml里的代码都是自动生成的~~没改过我,MyEclipse自动生成的也不行啊
    ,还是不太熟悉流程。把id改成native ??就行了?
      

  15.   

    <id name="workname" type="java.lang.String">
                <column name="workname" length="50" />
                <generator class="native"></generator>
            </id>
    你String的id怎么自增长啊
      

  16.   

    把ID改主键,重新建表,再自动生成WorkName.hbm.xml
      

  17.   


    <generator class="native" /> 改成 <generator class="assigned" /> 
      

  18.   

    数据库美问题,我看过了,就是生成映射的时候我可能一些属性不明白弄错了,现在我把WorkName.hbm.xml里的代码改成:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.pro.entity.WorkName" table="WorkName" schema="dbo" catalog="ProblemSys">
            <id name="id" type="java.lang.Integer">
                <column name="id" not-null="true"/>
                <generator class="native"></generator>
            </id>
            <property name="workname" type="java.lang.String">
               <column name="workname" length="50" />
            </property>
            <property name="bewrite" type="java.lang.String">
                <column name="bewrite" length="50" />
            </property>
            <property name="wkprincipal" type="java.lang.String">
                <column name="wkprincipal" length="50" />
            </property>
        </class>
    </hibernate-mapping>之后,点插入后,myeclip后台输出了insert into的代码:
    Hibernate: 
        insert 
        into
            ProblemSys.dbo.WorkName
            (workname, bewrite, wkprincipal) 
        values
            (?, ?, ?) select
                scope_identity(),但是为什么在库中找不到添加的数据呢?而且,只有关闭了tomcat后才能看数据库,开着的情况下查看库中数据没反应,假死状态。
      

  19.   

    因为你的id是自增长的,你不能设置你值,你在save的时候,别设置id的值,估计应该就可以啦
      

  20.   

    现在是插入一条数据后在库中无法查询,一查询就未响应,但是在网页上可以查到,但我关闭tomcat后,数据库正常,可以查看,里面没有新添加的数据,页面上页找不到刚才添加的数据了,是不是我哪里连接没有关闭什么的?一直在连接占着资源?
      

  21.   

    AWUSOFT、lewis219 还在么?帮我分析下哪里的原因~
    WorkName wkname = new WorkName();
    wkname.setWorkname(workname);
    wkname.setBewrite("");
    wkname.setWkprincipal("");
    WorkNameDAO um = new WorkNameDAO();
    um.save(wkname);
    是不是少些什么了??
      

  22.   

    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]事务(进程 ID  58)与另一个进程已被死锁在  lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。我连续添加两次就出现这样错误了。而且以后都是一致报这个错误。
    开启事物?
      

  23.   

    楼主加下我QQ57191841或留下你的QQ
      

  24.   

    <class name="com.pro.entity.WorkName" table="WorkName" schema="dbo" catalog="ProblemSys">
            <id name="id" type="java.lang.Integer">
                <column name="id" not-null="true"/>
                <generator class="increment"></generator>
            </id>
            <property name="workname" type="java.lang.String">
               <column name="workname" length="50" />
            </property>
            <property name="bewrite" type="java.lang.String">
                <column name="bewrite" length="50" />
            </property>
            <property name="wkprincipal" type="java.lang.String">
                <column name="wkprincipal" length="50" />
            </property>
        </class>
      

  25.   

    save完调用session的flush方法试试