繁体   English   中英

Hibrernate:必须为元素类型“ column”声明属性“ type”

[英]Hibrernate: Attribute “type” must be declared for element type “column”

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

这将产生NullPointerException

如果我理解正确,这意味着当我尝试保存到order_item表时,外键的getter为空,但是如果设计为“ Autoincrement”,我将如何设置它,我认为休眠将在其中进行处理交易。

以下是我的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();

因此,问题是:如何使用“自动增量”主键来处理这种情况,该主键不能作为外键被另一个表访问

因此,存在一些问题:

为了向数据库提交“子级”,我需要显示谁是父级。 这意味着我的LineItem类需要一个

Order order;

属性而不是简单

private String orderID;

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

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

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

DOCTYPE hibernate-mapping PUBLIC“-// Hibernate / Hibernate Mapping DTD 3.0 // EN”“ http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd

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

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

尝试更换:

<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"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM