Hibrernate:必须为元素类型“column”

时间:2015-08-12 15:23:48

标签: java sql-server hibernate

我正在尝试使用Hibernate保存到SQL Server中的两个表: ORDER和ORDER_ITEM 我收到一个错误: 必须为元素类型“column”声明属性“type”。 初始SessionFactory创建失败..org.hibernate.InvalidMappingException:无法读取XML。

这会产生NullPointerException

如果我理解正确,这意味着当我尝试保存到order_item表时,外键的getter是空的,但是如果设计为'Autoincrement'我将如何设置它,我认为hibernate会处理这是它的交易。

下面是我的POJO和Hibernate映射。我已从此复制/粘贴中省略了getter和setter,但它们存在于我的实际代码中

如果删除集合

,我也成功保存到ORDER表

Order.java:

public class Order {
public Order(){
    super();       
}

private int orderId;        
private Set<LineItem> items;         
private String strPhone;          
private String strEmail;    
private String strFirstName;   
private String strLastName;  
private String strParentFirstName;    
private String strParentLastName;    
private String strOrganizationName;    
private String strOrganizationType;         
private String strComment;         

}

order.hbm.xml:

<hibernate-mapping>
<class name="dbobjects.Order" table="orders">     

    <id name="orderId" type="integer" column="order_id">
        <generator class="increment"/>
    </id>

    <property name="strPhone"            type="string" column="phone_number"/>
    <property name="strFirstName"        type="string" column="first_name"/>
    <property name="strLastName"         type="string" column="last_name"/>
    <property name="strParentFirstName"  type="string" column="parent_first_name"/>
    <property name="strParentLastName"   type="string" column="parent_last_name"/>
    <property name="strOrganizationName" type="string" column="organization_name"/>
    <property name="strOrganizationType" type="string" column="organization_type"/>        
    <property name="strComment"          type="string" column="comments"/>

    <set name="items" table="order_item" fetch="select" cascade="all">
        <key>
            <column name="orderId" type="java.lang.Integer"/>                
        </key>
        <one-to-many class="dbobjects.LineItem"/>
    </set>

</class>    

LineItem.java:

public class LineItem {

public LineItem(){
    super();
}

private int orderItemId;//this will be the primary key
private int orderId;//this is the foreign key to the order 
private String age;    
private String gender;    
private String type;
private String itemSize;        
private int itemQuantity;

}

lineItem.hbm.xml:

  

<id column="order_item_id" name="orderItemId" type="integer">
  <generator class="increment"/>
</id>

<property column="age" name="age" type="string"/>
<property column="gender" name="gender" type="string"/>
<property column="quantity" name="itemQuantity" type="integer"/>
<property column="size" name="itemSize" type="string"/>
<property column="clothing_type" name="clothingType" type="string"/>

<many-to-one name="orderId" class="dbobjects.Order" fetch="select" column="order_id" type="java.lang.Integer"/>

这是我在设备会话时抛出错误的地方:

**session = HibernateUtil.getSessionFactory().openSession();**←
        try{        
        session.beginTransaction();
        session.save(order);
        session.getTransaction().commit();

所以问题是:如何使用另一个表无法作为外键访问的'autoincrement'主键来处理这种情况

3 个答案:

答案 0 :(得分:1)

所以,有一些问题:

为了提交一个孩子&#39;到数据库,我需要显示谁是父母。 这意味着我的LineItem类需要一个

Order order;

属性而不是简单的

private String orderID;

这是在Order对象准备好提交给DB之后但在实际调用之前完成的:

 for (LineItem item : order.getItems()) {
            item.setOrder(order);
        }

我还从更改了我的DTD!DOCTYPE hibernate-configuration SYSTEM classpath://org/hibernate/hibernate-mapping-3.0.dtd"

!DOCTYPE hibernate-mapping PUBLIC         &#34; - // Hibernate / Hibernate Mapping DTD 3.0 // EN&#34;         &#34; http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd&#34;

答案 1 :(得分:0)

只需添加“type”属性,如下所示:

<column name="orderId" type="java.lang.Integer"/>

答案 2 :(得分:0)

尝试替换:

<many-to-one name="orderId" column="order_id" class="dbobjects.Order" cascade="all">
    <column name="orderId" type="java.lang.Integer"/>   
</many-to-one>

通过

<many-to-one name="orderId" column="order_id" class="dbobjects.Order" cascade="all"/>