Hibernate避免重复行

时间:2015-09-21 22:15:17

标签: java sql spring hibernate jpa

ER Dagram:

ER Diagram

我的豆类和服务类如下:

@Entity
@Table(name = "EMPLOYEE")
public class EmployeeBean implements Serializable { 
    @Id
    @Column(name="EMP_ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int employeeid;

    @Column(name="EMP_NAME")
    private String employeeName;

    @ManyToMany(cascade=CascadeType.ALL)  
    @JoinTable(name="EMPLOYEE_SKILLS",  
    joinColumns={@JoinColumn(name="EMPLOYEE_ID", referencedColumnName="EMP_ID")},  
    inverseJoinColumns={@JoinColumn(name="SKILLS_ID")})  
    private Set<SkillsBean> skills;

    //Getters and Setters
}



@Entity
@Table(name="SKILLS")
public class SkillsBean implements Serializable {   
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="SKILL_ID")
    private String skillId;

    @Column(name="SKILL_NAME", unique = true)
    private String skillName;

    //Getters and Setters
}

//Service Class with insert method
@Service
public class EmployeeSkillsServiceImpl {
      public boolean insert(String employeeName,String skills) {
            String[] skillNames = skills.split(SKILLS_DELIMITER);
            Set<SkillsBean> skillSet = new HashSet<SkillsBean>();
            for(int i=0;i<skillNames.length;i++){
                skillBeanObj = new SkillsBean();
                skillBeanObj.setSkillName(skillNames[i]);
                skillSet.add(skillBeanObj);
            }

            //Call DAO class now
            EmployeeBean employeeBean = new EmployeeBean();
            employeeBean.setEmployeeName(employeeName);
            employeeBean.setSkills(skillSet);
            employeeSkillsDAO.insert(employeeBean); //simple insert with hibernate session and flush
}
}

要求: 招聘人员可以通过UI(JSP页面)添加员工姓名和技能名称(以逗号分隔)。

步骤中的当前问题: 步骤(1)招聘人员进入Joe&#39;和&#39; Java,Oracle&#39;,然后:

  

员工表:

1乔

  

技能表:

1 Java 2 Oracle

  

Employee_skills表:

1 1 1 2

到此为止我成功解决了任何问题,现在实际问题从步骤(2)开始。

步骤(2)招聘人员进入詹姆斯&#39;和&#39; Java&#39;那么,我期待在表格中的记录以下,但我面临一个例外。

  

员工表:

1乔

2詹姆斯

  

技能表:

1 Java

2 Oracle

  

Employee_skills表:

1 1

1 2

2 1

日志中抛出异常:

  

org.hibernate.exception.ConstraintViolationException:不能   insert:[com.esm.beans.SkillsBean]引起:   com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:   重复录入&#39; Java&#39;关键&#39; SKILL_NAME&#39;

此错误明确指出,这是因为SKILL_NAME上的唯一约束,但我无法将其删除,因为我不想 在技​​能表中多次插入相同的技能名称。

*那么如何通过修改EmployeeBean和SkillsBean bean来实现表中所需的输出?我在这里错过了什么? *

请帮忙。

2 个答案:

答案 0 :(得分:0)

您可以在提交之前在技能表中查找如果skill_name已经存在,则使用相同的ID并更新为“James”。

例如:

String [] skillNames = skills.split(SKILLS_DELIMITER);             设置skillSet = new HashSet();

//使用Dao类获取所有匹配的skillBeans
  //从两个列表中减去(skillNames - 现有技能名称)

        for(int i=0;i<skillNames.length;i++){
            skillBeanObj = new SkillsBean();
            skillBeanObj.setSkillName(skillNames[i]);
            skillSet.add(skillBeanObj);
        }

答案 1 :(得分:0)

您需要在服务的for循环中使用更多逻辑:

        for(int i=0;i<skillNames.length;i++) {
            skillBeanObj = // find by name in skillsBean Dao

            if (skillBeanObj == null) { // not found in DB, create new skill
              skillBeanObj = new SkillsBean();
              skillBeanObj.setSkillName(skillNames[i]);
            }
            skillSet.add(skillBeanObj);
        }