ER Dagram:
我的豆类和服务类如下:
@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来实现表中所需的输出?我在这里错过了什么? *
请帮忙。
答案 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);
}