日期:2014-05-20  浏览次数:20880 次

hibernate的org.hibernate.TransientObjectException异常怎么办处理
下面是异常信息
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.fyx.test.Order
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:430)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:101)
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:777)
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1165)
at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:171)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at com.fyx.test.Test.main(Test.java:62)
下面是代码

package com.fyx.test;

import java.util.HashSet;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test
{
private static SessionFactory sessionFactory;
static
{
try
{
sessionFactory = new Configuration().configure().buildSessionFactory();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public static void main(String[] args)
{
Session session = sessionFactory.openSession();
Transaction tx = null;
Customer customer = new Customer();
customer.setName("zhangsan");
customer.setOrders(new HashSet());



Order order1 = new Order();
order1.setOrderNumber("order1");



Order order2 = new Order();
order2.setOrderNumber("order2");


Order order3 = new Order();
order3.setOrderNumber("order3");


order1.setCustomer(customer);
order2.setCustomer(customer);
order3.setCustomer(customer);

customer.getOrders().add(order1);
customer.getOrders().add(order2);
customer.getOrders().add(order3);
try
{
tx = session.beginTransaction();
session.save(customer);
tx.commit();
}
catch(Exception ex)
{
if(null != tx)
{
tx.rollback();
}
ex.printStackTrace();
}
finally
{
session.close();
}
System.out.println("asdf");
}
}

------解决方案--------------------
Customer customer = new Customer();
customer.setName("zhangsan");
//customer.setOrders(new HashSet());//此处先不设置多端
session.save(customer);//先保存customer

Customer customer_find = session.findMethod();//session查找到刚插入的customer

Order order1 = new Order();
order1.setOrderNumber("order1");

Order order2 = new Order();
order2.setOrderNumber("order2");

Order order3 = new Order();
order3.setOrderNumber("order3");

//设置order对应的单端
order1.setCustomer(customer_find);
order2.setCustomer(customer_find);
order3.setCustomer(customer_find);