![](/img/trans.png)
[英]Attribute “column”/“type” must be declared for element type “property”
[英]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.