当前位置: 代码迷 >> Java Web开发 >> hibernate 多对多添加有关问题,弄一天多了,请求大佬解答。小的 在此谢过了
  详细解决方案

hibernate 多对多添加有关问题,弄一天多了,请求大佬解答。小的 在此谢过了

热度:6874   发布时间:2013-02-25 21:08:54.0
hibernate 多对多添加问题,弄一天多了,请求大佬解答。小的 在此谢过了。
映射表后第一次添加无问题   但是以后都报错 
错误为org.hibernate.NonUniqueObjectException:
求大佬  解答   弄一天多了 
百度了不少 关于这个错误的 答案 ,看懂了  但是怎么看  也没搞懂我这个,不知道究竟错哪了。

解释:EveryDay 双向多对多 Personnel 添加 EveryDay中添加多个Personnel  然后存入数据库 
DbDao db = DbDaoFactory.getDbDaoBean();
EveryDay everyDay = new EveryDay();
Set<Personnel> set = new HashSet<Personnel>();
String[] personnelID = new String[] { "1", "2" };
Personnel personnel = new Personnel();
for (String id : personnelID) {
personnel = (Personnel) db.find(personnel, Integer.parseInt(id));
System.out.println("personnel.id="+personnel.getId());
System.out.println(personnel.getName());
set.add(personnel);
}
System.out.println(set.size());
everyDay.setPersonnel(set);
db.add(everyDay);
DbDao 为接口  DbDaoBean实现DbDao 接口   DbDaoBean中的方法
public void add(Object object){
Session session=HibernateTools.getSession();
Transaction tx=session.beginTransaction();
try{
session.clear();
session.save(object);
tx.commit();
}catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally{
session.clear();
session.close();
}
}
public Object find(Object object,int id){
Session session=HibernateTools.getSession();
try{
object=session.get(object.getClass(), id);
session.flush();
session.clear();
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
return object;
}等啊等啊等啊等啊等啊你这个程序只有一部分,有些问题还不能确定。要把关联映射(hbm文件)贴上来。
但可以肯定,你这个程序写得很有问题。
hibernate的session,应该交给Spring管理,不应该在方法结尾就立刻关闭session。
因为hibernate的运行原理,session关闭之后是不能操作对象了的,这时候很可能出问题。所以在保存两个对象时,一定要保证session一直处于“开启”的状态。
在开发阶段,可以在hibernate的基础配置文件(一般是hibernate.cfg.xml)中添加如下语句:
<property name="hibernate.show_sql">true</property>
这样就能在控制台打印出hibernate生成的sql语句,很容易能知道是哪里出了问题。
交给Spring管理session,设置好传播特性(一般设为required),就不用管session的开闭了。由Spring来进行这些操作。
试着把Hibernate和Spring结合起来,估计能解决这个问题。是否是这个异常信息:a different object with the same identifier value was already associated with the session?

如果是的话 那么证明你session中存在两个一样的实体 包括id 只不过俩个变量名不一样、

这时候hibernate就会出这个错误、

你的代码也没仔细看、不过应该是  你先查出来 然后一系列操作后在保存成新的、

personnel = (Personnel) db.find(personnel, Integer.parseInt(id));//这里的personnel 已经加入hibernate缓存里了、
System.out.println("personnel.id="+personnel.getId());
System.out.println(personnel.getName());
set.add(personnel);//这里就会报错误了

hibernate的实体三个状态你应该了解、
(1)瞬时
(2)持久化
(3)脱管(游离态)

你find功能查出来后、hibernate把这个实体已经持久化了、

你应该把他变为脱管(游离态)出来、

public Object find(Object object,int id){
Session session=HibernateTools.getSession();
try{
object=session.get(object.getClass(), id);

session.evict(object);//这里是修改的部分 拆分成游离态我等啊等  等啊等
  相关解决方案