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);//这里是修改的部分 拆分成游离态
session.flush();
session.clear();
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
return object;
}
你在试试、
[解决办法]
谢谢各位回答 我都试了不好使
[解决办法]
该项目 只用的hibernate 和struts
将 两个Personnel 查出 放入 set集合 查出后session关闭。 然后存入 everyday 存入的时候报错 说是session 中有不同主键。
[解决办法]
问题就是你当前的session要保存的object的objectId,
已经存在于session关联的对象集合中。
你可以再debug模式下,打断点到保存这行,然后查看下set的内容。
Set<Personnel> set = new HashSet<Personnel>();
看是否有id和即将保存的objectid重复
[解决办法]
多对多的情况下,你find(classid)的话查出来的不是单一实体,而是一个list吧,我感觉是这个问题
[解决办法]
弄个断点仔细看看
[解决办法]
谢谢各位了 虽然我的问题还没有解决 哪天 找老师去吧
[解决办法]
null
[解决办法]
null