отношение один ко многим и много к одному в спящем режиме - PullRequest
0 голосов
/ 07 марта 2012

Привет, я новичок в hibernate. У меня есть один класс Customer, который имеет отношение один-ко-многим с классом Order, а класс Oder имеет отношение один-ко-многим с классом Item, а класс One-один - с Customer.and Класс элемента имеетотношение один ко многим с классом продукта.Мой файл hbm.xml выглядит следующим образом

<?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>
<class name="com.xyz.hibernet.dto.Customer" table="CUSTOMER" abstract="true">
        <id name="cid"  type="java.lang.Integer" column="CUST_ID" >
        <generator class="native"/>
         </id>
        <property name="cname" column="CUST_NAME"/>
        <list name="orderList" cascade="all">
           <key column="CUST_ID"/>
           <index column="idx"/>
            <one-to-many class="com.activenet.hibernet.dto.Order"/>
         </list>
    </class>



    <class name="com.xyz.hibernet.dto.Order" table="ORDER">
        <id name="oid" type="java.lang.Integer" column="O_ID" >
             <generator class="native"/>
        </id>
        <property name="odate" column="ORDER_DATE"/>
        <property name="amt" column="AMOUNT"/>
        <set name="itemSet" inverse="true" cascade="all">
            <key column="O_ID"/>
            <one-to-many class="com.activenet.hibernet.dto.Item"/>
        </set>
        <many-to-one name="oCustomer" class="com.activenet.hibernet.dto.Customer" column="CUST_ID"/>
    </class>

    <class  name="com.xyz.hibernet.dto.Item" table="ITEM">

        <id name="iid" type="java.lang.Integer" column="ITEM_ID" >
             <generator class="native"/>
        </id>
        <property name="quantity" column="ORDER_QTY"/>
        <many-to-one name="product" class="com.activenet.hibernet.dto.Product" column="PRODUCT_ID"/>
    </class>
    <class  name="com.xyz.hibernet.dto.Product" table="PRODUCT">

        <id name="pid" type="java.lang.Integer" >
            <column name="PROD_ID" />
            <generator class="native"/>
        </id>
        <property name="pname" column="PROD_NAME"/>
        <property name="price" column="PROD_PRICE"/>
        <property name="descr" column="PROD_DESC"/>

    </class>

<!--    <query name="findAllCustomers">
    <![CDATA[from com.xyz.hibernet.dto.Customer c where c.name=:name]]>
    </query>-->

</hibernate-mapping>

И

Класс клиента выглядит следующим образом

 import java.util.List;

 public class Customer {

private int cid;
private String cname;
private List orderList;

public Customer()
{
    super();
}
public Customer(int cid,String cname, List orderList)
{
    super();
    this.cid=cid;
    this.cname=cname;
    this.orderList=orderList;
}
--setter and getter 
 }

Product.java

   public class Product {

private int pid;
private String pname;
private double price;
private String descr;

public Product() {
    super();
}

public Product(int pid,String pname,double price,String descr) {
    super();
    this.pid=pid;
    this.pname=pname;
    this.price=price;
    this.descr=descr;
}

Setter and getter methods----here   
}

Order.java

  public class Order {

private int oid;
private Date odate;
private double amt;
private Set itemSet;
private Customer oCustomer;

    public Order()
{
    super();
}
   public Order(int oid,Date odate,double amt, Set itemSet)
   {
 super();
 this.oid=oid;
 this.odate=odate;
 this.itemSet=itemSet;
 this.amt=amt;
   }
 -- setter and getter
   }

Item.java

  public class Item {

private int iid;
private Product product;
private int quantity;
public Item ()
{
    super();
}

public Item (int iid,Product product,int quantity)
{
    super();
    this.iid=iid;
    this.product=product;
    this.quantity=quantity;
}

}

Мой тестКласс выглядит как нижеговорит У вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом со значениями 'ORDER (ORDER_DATE, AMOUNT, CUST_ID) (' 2012-03-07 11:58:55 ', 1200.0, null)' в строке 1

Я много пробовал, но не смог это исправить.Пожалуйста, помогите мне, где проблема

1 Ответ

0 голосов
/ 07 марта 2012

Поскольку экземпляр Customer (т.е. oCustomer) в Order (т.е. oOrder) не задан (т.е. NULL), hibernate вставит NULL для столбца ORDER.CUST_ID. Это определенно будет выдавать ошибки, так как этот столбец имеет ограничение FK для клиента, который не может принять NULL.

Во-первых, пусть Заказ несет ответственность за обработку отношений между Клиентом и Заказом, установив для атрибута inverse <set> внутри Клиента значение true.

(PS inverse атрибут очень сложен для понимания для начинающего IMO, но вы можете легко найти много ресурсов об этом атрибуте. Обычно в <one-to-many> отношении мы устанавливаем его в true в теге коллекции (т.е. <set>, <list>))

Затем установите customer1 как клиент oOrder перед сохранением, например:

 Customer customer1=new Customer();
 customer1.setCid(0);
 customer1.setCname("ABC");

 Order oOrder=new Order();
 oOrder.setOid(0);
 oOrder.setOdate(Calendar.getInstance().getTime());
 oOrder.setAmt(1200.00);
 oOrder.setItemSet(itemSet);
 oOrder.setOcustomer(customer1);

 oSession.save(customer1); 
 oSession.save(oOrder);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...