试图先插入一个order,"然后更新一个" 这就会。
引号中的是多余的,写错了。

解决方案 »

  1.   

    应该先
       tx = s.beginTransaction();
                
                User u = new User();
                s.save(u);//
                Order order = new Order(u);
                s.save(order);            
                tx.commit();
      

  2.   

    那cascade="save-update"是干嘛用的?
      

  3.   

    晕~~~在many-to-one 使用级联应该没有意义的  请参考hibernate 3.1x DOC 第11章:
    It doesn't usually make sense to enable cascade on a <many-to-one> or <many-to-many> association. Cascade is often useful for <one-to-one> and <one-to-many> associations.
      

  4.   

    It doesn't usually != It never
      

  5.   

    many-to-one 是不会保存主键对象的,因为他是外键约束,他会认为主键的对象已经存在于数据库中了
    不信你可以先创建一个只有主键值,其他值为null的USER对象,然后order.set(user)
    save order
    你看数据库数据,会发现保存成功所以你必须先user.add(order)
    然后再save user
    这样就可以全部保存
    one-to-many就不一样了
      

  6.   

    所有的级联更新,保存,删除都只对应one-to-manymany-to-one 是不会引起级联操作的
      

  7.   

    我已经找到问题所在了,是因为我的对象的主键id用的原始类型,但没有设置unsaved-value,都改成Integer就可以了。
    楼上的理解有不对的地方,早点纠正吧。你可以多找一些基础的资料看一下,而且以后没弄清楚可别乱说哦,以免误导了新手。
    对于many-to-one是可以级联的,我已经试验成功了,如果不起作用为什么还保留这个级联属性呢,设计师不可能犯这种错误吧。而且《精通hibernate》中也有非常明确的例子,但是他没有强调主键应该用包装类型,所以导致我的出现了问题。
      

  8.   

    你所说的“他会认为主键的对象已经存在于数据库中了”也是我说的那个原因。因为hibernate根据主键来判断对象状态,正因为你使用了int类型,而只有当对象为null的时候才认为是临时状态,但是null!=0,因此,你必须在主键上加上<id name="id" unsaved-value="0">来解决这一问题,或者全部改为Integer类型。
      

  9.   

    我觉得楼上的不要只相信书上说的。有时间看看官方文档,看看设计师写的文档。还有,很少有人会在many-to-one中使用级联属性,通常情况使用它毫无意义的。hibernate 3.1x 自带的doc文档吧  在第11章中,我想问一个问题,如果把你的代码改成:<many-to-one name="custom" column="customID" class="hibernatetest.User" cascade="delete"/>,要是这代码能使用,我到觉得设计师要考虑一下?
      

  10.   

    楼主的问题  其实也没那么严重  我在测试过程中使用的type是hibernate的数据类型,也没有说要设置默认值,能够顺利通过。cascade可以使用,但是不推荐在many-to-one中使用,更多的使用在one-to-one和one-to-many中,一般情况下,对程序的编写意义不大。:<many-to-one name="custom" column="customID" class="hibernatetest.User" cascade="delete"/>,这个关联是可以执行,实际情况没人这么做的。
      

  11.   

    当然,不实用的东西我是不会用的,我这不是在尝试吗?要把所有的情况下的表现都研究透彻才行。另外我发现,在多对多关系中,如果连接关系采用一个类来表示,也就是拆成两个以多对关系的时候,我可以在many-to-one中设置cascade="save-update"。这时候我认为就很有意义了。比如Student,Course是多对多的,连接类是Mark。
    Student s = new Student();
    Course c = new Course();Mark m = new Mark(s,c);
    session.save(m);
    这样我只要保存关联就可以了。在我可控的知识范围内,我保证了语句的最少化,而且增加了可读性,这有什么不好呢?否则我就必须这样写
                Student student = new Student();
                Course course = new Course();
                
                Mark m = new Mark(student,course);
                
                student.getMarks().add(m);//会造成student加载所有的
                course.getMarks().add(m);//会造成course加载所有的
                
                s.save(student);
                s.save(course);
      

  12.   

    我的怎么不还是不行呀?
    tomcat5 + sqlserver2000 + hibernate3.1 + spring
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="mypetstore.model.businessobject">
        <class name="Order" table="ORDERS">
            <id name="orderId" column="ORDERID" unsaved-value="null">
                <generator class="assigned"/>
            </id>        <property name="username"
                      column="USERID"
                      not-null="true"/>        <property name="orderDate"
                      column="ORDERDATE"
                      type="date"
                      not-null="true"/>        <property name="shipAddress1"
                      column="SHIPADDR1"
                      not-null="true"/>        <property name="shipAddress2"
                      column="SHIPADDR2"/>        <property name="shipCity"
                      column="SHIPCITY"
                      not-null="true"/>        <property name="shipState"
                      column="SHIPSTATE"
                      not-null="true"/>        <property name="shipZip"
                      column="SHIPZIP"
                      not-null="true"/>        <property name="shipCountry"
                      column="SHIPCOUNTRY"
                      not-null="true"/>        <property name="billAddress1"
                      column="BILLADDR1"
                      not-null="true"/>        <property name="billAddress2"
                      column="BILLADDR2"/>        <property name="billCity"
                      column="BILLCITY"
                      not-null="true"/>        <property name="billState"
                      column="BILLSTATE"
                      not-null="true"/>        <property name="billZip"
                      column="BILLZIP"
                      not-null="true"/>        <property name="billCountry"
                      column="BILLCOUNTRY"
                      not-null="true"/>        <property name="courier"
                      column="COURIER"
                      not-null="true"/>        <property name="totalPrice"
                      column="TOTALPRICE"
                      not-null="true"/>        <property name="billToFirstName"
                      column="BILLTOFIRSTNAME"
                      not-null="true"/>        <property name="billToLastName"
                      column="BILLTOLASTNAME"
                      not-null="true"/>        <property name="shipToFirstName"
                      column="SHIPTOFIRSTNAME"
                      not-null="true"/>        <property name="shipToLastName"
                      column="SHIPTOLASTNAME"
                      not-null="true"/>        <property name="creditCard"
                      column="CREDITCARD"
                      not-null="true"/>        <property name="expiryDate"
                      column="EXPRDATE"
                      not-null="true"/>        <property name="locale"
                      column="LOCALE"
                      not-null="true"/>        <set name="lineItems" cascade="delete">
                <key column="ORDERID"/>
                <one-to-many class="LineItem"/>
            </set>
        </class>
    </hibernate-mapping>
      

  13.   

    我市修改了mypetstore for mysql的。
    把原来的hibernate2 升级到了3.0 和sqlserver2000
      

  14.   

    10:50:06,129 DEBUG OrderBean:28 - Creating order bean
    10:50:06,129 DEBUG OrderBean:46 - Order bean is created
    10:50:06,139 DEBUG OrderBean:36 - service locator is set
    10:50:06,139 DEBUG OrderBean:55 - createOrderAction is invoked
    Hibernate: select sequence0_.NAME as NAME10_0_, sequence0_.SEQNUM as SEQNUM10_0_ from SEQUENCE sequence0_ where sequence0_.NAME=?
    10:50:06,169 DEBUG OrderDaoHibernateImpl:23 - 1002 mypetstore.model.businessobject.Order@1649a55
    Hibernate: insert into ORDERS (USERID, ORDERDATE, SHIPADDR1, SHIPADDR2, SHIPCITY, SHIPSTATE, SHIPZIP, SHIPCOUNTRY, BILLADDR1, BILLADDR2, BILLCITY, BILLSTATE, BILLZIP, BILLCOUNTRY, COURIER, TOTALPRICE, BILLTOFIRSTNAME, BILLTOLASTNAME, SHIPTOFIRSTNAME, SHIPTOLASTNAME, CREDITCARD, EXPRDATE, LOCALE, ORDERID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    Hibernate: update SEQUENCE set SEQNUM=? where NAME=?
    Hibernate: update LINEITEM set ORDERID=? where ORDERID=? and LINENUM=?
    10:50:06,209 ERROR AbstractFlushingEventListener:299 - Could not synchronize database state with session
    org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: mypetstore.model.businessobject.LineItem
    at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
    at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:71)
    at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:697)
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1037)
    at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:26)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:490)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:495)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:468)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:258)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
    at $Proxy13.saveOrder(Unknown Source)
    at mypetstore.view.bean.OrderBean.createOrderAction(OrderBean.java:57)