我看hibernate输入的SQL语句发现就是一条update语句,而且语句中还包括where Id=? Id是自动编号的字段,没有insert怎么能直接update记录了呢?

解决方案 »

  1.   

    我看hibernate输入的SQL语句发现就是一条update语句,而且语句中还包括where Id=? Id是自动编号的字段,没有insert怎么能直接update记录了呢?
    哦,你不是添加数据吗,怎么会出现update,不把相关的代码贴出来很难看的
      

  2.   

    这个是Many一方的映射文件,CustomerID字段关联主表的Id字段
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping>
        <class name="net.liwenqiu.hibernate.study.pojo.OrderList" table="orderlist">
            <id name="id" column="Id">
                <generator class="increment" />
            </id>
            <property name="objectName" column="ObjectName" />
    <property name="number" column="Number" /> <many-to-one name="customer" 
         class="net.liwenqiu.hibernate.study.pojo.Customer"
         cascade="none"
         outer-join="auto"
         update="true"
         insert="true"
         column="CustomerId"
         not-null="true"
    />
        </class>
    </hibernate-mapping>
      

  3.   

    这个是one一方的映射文件:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping>
        <class name="net.liwenqiu.hibernate.study.pojo.Customer" table="customer">
            <id name="id" column="Id">
                <generator class="increment" />
            </id>
            <property name="name" column="Name" />
            <property name="email" column="Email" />
    <property name="phone" column="Phone" />
    <property name="address" column="Address" /> <set name="orders"
         table="orderlist"
         lazy="false"
         inverse="true"
         cascade="all"
         sort="unsorted">
         <key column="CustomerId"></key>
         <one-to-many class="net.liwenqiu.hibernate.study.pojo.OrderList"/>
    </set>
        </class>
    </hibernate-mapping>
      

  4.   

    OrderList的代码:
    package net.liwenqiu.hibernate.study.pojo;public class OrderList  {
    private int id;
    private String objectName;
    private int number;
    private Customer customer; public int getId() {
    return this.id;
    }
    public String getObjectName() {
    return this.objectName;
    }
    public int getNumber() {
    return this.number;
    }
    public Customer getCustomer() {
    return this.customer;
    } public void setId(int id) {
    this.id = id;
    }
    public void setObjectName(String objectName) {
    this.objectName = objectName;
    }
    public void setNumber(int number) {
    this.number = number;
    }
    public void setCustomer(Customer customer) {
    this.customer = customer;
    }
    }
      

  5.   

    generator class="increment"
    increment换成native 试试
    我想知道你怎么保存儿子的,你在mapping  里面用了inverse="true"
    就必须指定父亲 OrderList.setCustomer(customer);
      

  6.   

    Customer代码:
    package net.liwenqiu.hibernate.study.pojo;import java.util.*;public class Customer {
        
        private int id;
        private String name;
        private String email;
    private String phone;
    private String address; private Set orders = new HashSet();  public int getId() {
    return this.id;
    }
    public String getName() {
    return this.name;
    }
    public String getEmail() {
    return this.email;
    }
    public String getPhone() {
    return this.phone;
    }
    public String getAddress() {
    return this.address;
    }
    public Set getOrders() {
    return this.orders;
    } public void setId(int id) {
    this.id = id;
    }
    public void setName(String name) {
    this.name = name;
    }
    public void setEmail(String email) {
    this.email = email;
    }
    public void setPhone(String phone) {
    this.phone = phone;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    public void setOrders(Set orders) {
    this.orders = orders;
    }}
      

  7.   

    OrderList orderList = new OrderList();
    orderList.setObjectName("ABC");
    orderList.setNumber(1);
    orderList.setCustomer(customer);//这里有保存的方法
    customer.getOrders().add(orderList);
      

  8.   

    customer.getOrders().add(orderList);//这句话多余,因为你用了inverse="true"
    你的保存语句呢?没有session.save(orderList)?或者是session.update(customer)
      

  9.   

    loverisyour(想飞的象) : 我改为native了,但是仍然出现同样的错误!
      

  10.   

    保存语句用的是: session.save(customer);
      

  11.   

    Session hsession = HibernateUtil.getInstance().getSession();
    Transaction trans = null;
    try{
    trans = hsession.beginTransaction();
    Customer customer=hsession.load(Customer.class,id);
    OrderList orderList = new OrderList();
             orderList.setObjectName("ABC");
             orderList.setNumber(1);
             orderList.setCustomer(customer);
    hsession.save(cost);
    trans.commit();
    }
    catch (Exception e) {
    e.printStackTrace();
    trans.rollback();
    }
    finally {
         hsession.close();
    }
      

  12.   

    你父亲是new 的还是存在的,已经存在的话就不能save啊
      

  13.   

    Customer customer=(Customer)hsession.load(Customer.class,id);
    hsession.save(orderList);
    刚才改错拉,你直接保存儿子看看,如果父亲是已经存在的
      

  14.   

    loverisyour(想飞的象)  你给出的代码我试过了,确实可行,但是如果父亲是new出来的话用什么保存父亲和儿子呢?
      

  15.   

    是不是哪一方的inverse="false",在保存的时候就要save这一方?
      

  16.   

    new 出来的你就先儿子set父亲,在保存父亲。
    如果你不知道是不是new 来的,可以用saveOrUpdate()方法
      

  17.   

    不是啊
    inverse=true作用: 这里关系是由儿子维护的,所以如果只是往父亲里加入儿子,不给儿子设置父亲的话session.save(parent),就不会保存儿子!这里只会有insert语句
    inverse="false"是指父子之间的关系由两方来维护,但性能慢,因为父亲有个孩子的集合,他无法知道哪个孩子的父亲id已经指向自己了,除了insert语句外,会多出update语句