日期:2014-05-19  浏览次数:20700 次

急!!数据库表中不插入重复数据的处理 100分哦
表 :paperchoice 字段:paperId choiceId 不是自增的 
  1 2
  1 3
  1 8
  20 25
  20 28
现在如果插入 (1,2)的话就会报错 需求就是不允许插入重复数据 
 

框架用的是struts2+hibernate···求大牛支招哇!!!

action:
public String addPaperChoice() {
if(paperchoices != null && paperchoices.size() > 0){
for(int i = 0; i < paperchoices.size(); i++){
int value_int, pid;
String value_str = paperchoices.get(i);
if(value_str != null && value_str != ""){
value_int = Integer.parseInt(value_str);
} else {
value_int = 0;
}
if(paperId != null && paperId != ""){
pid = Integer.parseInt(paperId);
} else {
pid = 0;
}
if(value_int != 0 && pid != 0){
PaperChoice pc = new PaperChoice();
pc.setChoiceId(value_int);
pc.setPaperId(pid);
paperService.addPaperChoice(pc);
}
}
return "success";
}
  // 容错处理...

return "input"; 
}

dao层
public boolean addPaperChoice(PaperChoice paperchoice) {
Long i=null;

Session session = HibernateSessionFactory.getSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.save(paperchoice);

tx.commit();
}
catch (HibernateException e)
{
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
throw e;
}finally{
HibernateSessionFactory.closeSession();
}

return true;
}

在这基础上 怎么改?

------解决方案--------------------
在你获取到paperId choiceId 这两个值后,先count下,如果结果大于零,则提示不允许插入,否则就执行添加操作。建议用存储过程实现。
------解决方案--------------------
看你介绍的有点糊涂:
你说会报错,那么报错就是不能插入重复数据,不是正好符合你的要求么?忽略这种插入重复的错误,继续插入下一条好了。

你究竟是要:
1、不应该能插入重复数据;但现在实际情况是可以;
2、应该能插入重复数据;但是现在实际情况是不行;
哪种情况?

------解决方案--------------------
需求就是不允许插入重复数据 那插入报错不是你要的吗?你是要他不报错 提示不能插入重复数据?

你直接先去查询数据如果查询出一条就提示不能插入重复数据
------解决方案--------------------
先用paperId与choiceId一起作为条件去查数据库中是否已经存在,如果存在则提示重复;如果不存在则插入
------解决方案--------------------
这很简单啊,就是13楼回复的,不懂写?我帮你写一个:

paperId choiceId
1 2
1 3
1 8
20 25
20 28

在hibernate里面,写这样一个方法,这个方法的作用是判断数据库是否存在那条记录,如果存在则返回true, 否则返加false,传入两个参数:
public Boolean isExistPaperchoice(paperId, choiceId) {
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Query q = session.createQuery(
"select count(*) from paperchoice where paperId = :x and choiceId = :y") ;
q.setParameter("x", paperId);
q.setParameter("y", choiceId);
long count = (Long)q.uniqueResult();
session.getTransaction().commit();
if(count == 0)
return false;
return true;
}

然后再你的程序里面加上这一段:
if(isExistPaperchoice(paperId, choiceId) == false) {
addPaperChoice(PaperChoice paperchoice)
}

------解决方案--------------------
一个是联合主键,然后抓主键冲突异常,或者是2楼的先查询一下表中是否已有要插入的数据,有就报错,然后要么继续,要么让操作者修改后重新操作,没有就直接插入。