hibernate一对多,不能根据 一的那方 得到 多的那方
下面是问题简述, 希望有大神不吝赐教.
User类属性(one)
private String user_id;//主键
private String name;
private String password;
private String preference;
private List<Order> orders;//订单集合
Order类属性(many)
private String order_id;//主键
private BigDecimal price;
private Date createDatetime;
private User user;//外键
private String backup;
USER xml配置
<hibernate-mapping
package="com.hbt3.entity">
<class name="User" table="t_user" lazy="true">
<id name="user_id" column="user_id">
<generator class="native"/>
</id>
<!-- <property name="userId" column="user_id"/> -->
<property name="name"/>
<property name="password"/>
<property name="preference"/>
<list name="orders" inverse="true" cascade="all" lazy="true">
<key column="user_id" ></key><!-- 一对多,多方的外键列 -->
<index column="order_id" type="java.lang.String"></index>
<one-to-many class="com.hbt3.entity.Order"/>
</list>
</class>
</hibernate-mapping>
Order xml配置
<hibernate-mapping package="com.hbt3.entity">
<class name="Order" table="t_order" lazy="true">
<id name="order_id" column="order_id">
<generator class="native"/>
</id>
<property name="price" column="price"/>
<property name="createDatetime"/>
<property name="backup"/>
<many-to-one name="user" class="com.hbt3.entity.User" outer-join="true" >
<column name="user_id"></column>
</many-to-one>
</class>
</hibernate-mapping>
// 下面是一个测试方法代码片段
public static void query(){
Session session = HibernateUtil.getSession();// 获取session会话对象
session.beginTransaction();// 开始一个事务
String hql = " from User where name = ? ";
Query hqlQuery = session.createQuery(hql);// hql查询接口
hqlQuery.setParameter(0, "黄某");
List userList = hqlQuery.list();
Iterator iter = userList.iterator();
while(iter.hasNext()) {
User user=(User) iter.next();
System.out.println("user.name=" + user.getName());
System.out.println("user.orders=" + user.getOrders().size()); // ***为何无法拿到order****
}
if(session != null){
session.close();
}
}
下面是测试方法执行的控制台打印信息:
Hibernate: select user0_.user_id as user1_1_, user0_.name as name1_, user0_.password as password1_, user0_.preference as preference1_ from t_user user0_ where user0_.name=?
user.name=黄某
Hibernate: select orders0_.user_id as user5_1_, orders0_.order_id as order1_1_, orders0_.order_id as order1_0_0_, orders0_.price as price0_0_, orders0_.createDatetime as createDa3_0_0_, orders0_.backup as backup0_0_, orders0_.user_id as user5_0_0_ from t_order orders0_ where orders0_.user_id=?
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not initialize a collection: [com.hbt3.entity.User.orders#91E08E9141054A199E88C654777A906C]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2026)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:59)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:587)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1744)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:131)
at org.hibernate.collection.PersistentList.size(PersistentList.java:114)
at com.hbt3.app.One2Many.query(One2Many.java:35)
at com.hbt3.app.One2Many.main(One2Many.java:17)
Caused by: java.sql.SQLException: 无法转换为内部表示
at oracle.jdbc.driver.CharCommonAccessor.getInt(CharCommonAccessor.java:147)
at oracle.jdbc.driver.T4CVarcharAccessor.getInt(T4CVarcharAccessor.java:815)
at oracle.jdbc.driver.OracleResultSetImpl.getInt(OracleResultSetImpl.java:896)
at oracle.jdbc.driver.OracleResultSet.getInt(OracleResultSet.java:434)
at org.hibernate.type.IntegerType.get(IntegerType.java:51)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)
at org.hibernate.persister.collection.AbstractCollectionPersister.readIndex(AbstractCollectionPersister.java:730)
at org.hibernate.collection.PersistentList.readFrom(PersistentList.java:402)
at org.hibernate.loader.Loader.readCollectionElement(Loader.java:1031)
at org.hibernate.loader.Loader.readCollectionElements(Loader.java:669)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:614)
at org.hibernate.loader.Loader.doQuery(Loader.java:724)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2019)
... 10 more