【问题标题】:HIbernate saving the entitiy issueHIbernate 保存实体问题
【发布时间】: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


    【解决方案1】:

    更改表“EMPLOYEE_PROJECT”的名称,因为您不能为不同的表提供两次相同的名称,这是没有意义的。

     @OneToOne(cascade = CascadeType.ALL)
                        @JoinTable(name = "EMPLOYEE_ROLE", joinColumns = { @JoinColumn(name = "PROJECT_PKEY")}, inverseJoinColumns = { @JoinColumn(name = "ROLE_PKEY") })
                        private Role role;
    

    还有:

      @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);
    

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多