映射表后第一次添加无问题 但是以后都报错
错误为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);//这里是修改的部分 拆分成游离态我等啊等 等啊等