我正在尝试使用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'主键来处理这种情况
答案 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"/>