【发布时间】:2016-08-11 00:23:42
【问题描述】:
我在使用休眠将实体保存在数据库中时遇到问题。 我正在寻找的是我想通过以下方式获取记录。
Employee().getProjects()[0].getRole() ---------> 应该得到分配给一个角色的角色 项目的员工。
员工将有多个项目,每个项目都会有一个角色。分配员工时 对于项目,条目应保存在 EMPLOYEE_PROJECT 表中,其中包含employeeid、projectid 和 roleid。 当我保存实体时,我遇到了异常。我不明白这个问题。 我不确定这是获得 Employee->Project->Role 的正确方法。
Exception in thread "main" java.lang.ExceptionInInitializerError
at Client2.main(Client2.java:23)
Caused by: org.hibernate.AnnotationException: A Foreign key refering com.timesheet.entities.Role from com.timesheet.entities.Project has the wrong number of column. should be 1
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:273)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:89)
at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)
at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:438)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:309)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1319)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at com.timesheet.dao.BaseDao.<clinit>(BaseDao.java:18)
... 1 more
@Entity
@Table(name="ROLE")
public class Role implements Serializable {
@Id
@GeneratedValue
@Column(name = "ROLE_PKEY")
private Long id;
private String roleId;
private String roleName;
Getters and setters
}
@Entity
@Table(name="PROJECT")
public class Project {
@Id
@GeneratedValue
@Column(name = "PROJECT_PKEY")
private long projectKey;
//@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "PROJECT_ID")
private String projectId;
@Column(name = "PROJECT_NAME")
private String projectName;
@ManyToMany(mappedBy="projects", cascade = CascadeType.ALL ,fetch=FetchType.EAGER)
private Set<Employee> employee = new HashSet<Employee>();
@OneToOne(cascade = CascadeType.ALL)
@JoinTable(name = "EMPLOYEE_PROJECT", joinColumns = { @JoinColumn(name = "PROJECT_PKEY")}, inverseJoinColumns = { @JoinColumn(name = "ROLE_PKEY") })
private Role role;
//gettters and setters
}
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue
@Column(name = "EMPLOYEE_PKEY")
private long employeePkey;
@Column(nullable = false)
private String employeeId;
@Column(nullable = false)
private String firstName;
@Column(nullable = false)
private String lastName;
private String password;
private boolean active = true;
//@OneToMany(cascade = CascadeType.ALL ,fetch=FetchType.EAGER)
@ManyToMany(cascade = CascadeType.ALL ,fetch=FetchType.EAGER)
@JoinTable(name = "EMPLOYEE_PROJECT", joinColumns = { @JoinColumn(name = "EMPLOYEE_PKEY") }, inverseJoinColumns = { @JoinColumn(name = "PROJECT_PKEY") })
private Set<Project> projects = new HashSet<Project>(0);
//Getters and setters
}
public class Client2 {
public static void main(String[] args) {
try {
Employee emp = new Employee();
emp.setEmployeeId("abcd");
emp.setFirstName("fdfdfd");
emp.setLastName("dd");
emp.setActive(true);
emp.setPassword("dd");
Role role = new Role();
role.setRoleId("TL");
role.setRoleName("PROJECT MANAGER");
RoleDao dao = new RoleDao();
IEmployeeDao empDao = new EmployeeDao();
empDao.saveEmployee(emp);
dao.saveRole(role);
Role role2 = dao.findEntity(1, Role.class);
Project p = new Project();
p.setProjectId("dddd");
p.setProjectName("def");
p.setRole(role2);
new ProjectDao().saveProject(p);
Employee employee = empDao.findEmployee(1);
employee.getProjects().add(p);
empDao.updateEmployee(employee);
} catch (Exception e2) {
e2.printStackTrace();
}
}
【问题讨论】:
标签: hibernate