【问题标题】:Hibernate bean mappings for joining 3 tables用于连接 3 个表的休眠 bean 映射
【发布时间】:2015-09-23 14:34:45
【问题描述】:

我从来没有通过加入 3 个表来编写 Hibernate 代码,我遇到了困难。

我有以下 3 个数据库表。

CREATE TABLE EMPLOYEE (  
  EMP_ID int(6) NOT NULL AUTO_INCREMENT,  
  EMP_NAME varchar(20) NOT NULL,  
  PRIMARY KEY (EMP_ID));     

CREATE TABLE SKILLS (  
  SKILL_NAME varchar(20) NOT NULL,  
  PRIMARY KEY (SKILL_NAME)
);  

CREATE TABLE EMPLOYEE_SKILLS( 
  EMPLOYEE_ID int(6) NOT NULL,  
  SKILL varchar(20) NOT NULL,   
  KEY EMPLOYEE_fk (EMPLOYEE_ID),  
  KEY SKILLS_fk (SKILL),  
  CONSTRAINT EMPLOYEE_fk FOREIGN KEY (`EMPLOYEE_ID`) REFERENCES `EMPLOYEE` (`EMP_ID`) ON DELETE CASCADE ON UPDATE CASCADE,  
  CONSTRAINT SKILLS_fk FOREIGN KEY (`SKILL`) REFERENCES `SKILLS` (`SKILL_NAME`) ON DELETE CASCADE ON UPDATE CASCADE, 
  UNIQUE(EMPLOYEE_ID,SKILL)
);

请找到以下 bean 类:

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

    //Add Mappings here
}


@Entity
@Table(name="SKILLS")
public class SkillsBean implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="SKILL_NAME", unique = true)
    private String skillName;

    //Add your mappings here
}

@Entity
@Table(name = "EMPLOYEE_SKILLS")
public class EmployeeSkillsBean implements Serializable {

    @Embeddable
    public static class Id implements Serializable {

        @Column(name="EMPLOYEE_ID")
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private int employeeId;

        @Column(name="SKILL")
        private String skillName;

        public Id() {
        }

        public Id(int employeeId, String skillName) {
            this.employeeId = employeeId;
            this.skillName = skillName;
        }

        public boolean equals(Object obj) {
            if(obj != null && obj instanceof Id) {
                Id idObj = (Id)obj;
                return this.employeeId == idObj.employeeId && this.skillName.equals(idObj.skillName) ;
            } else {
                return false;
            }
        }

        public int hashcode() {
            return employeeId+"".hashCode() + skillName.hashCode();
        }
    }

    @EmbeddedId
    private Id id = new Id();

    //Add your mappings here    
}

我的要求是,用户从 UI(JSP) 输入员工姓名和技能名称,并将其插入到 EMPLOYEE_SKILLS 表中。此表包含多个员工及其多种技能。

您能帮忙将所需的 Hibernate 映射添加到上述 Bean 吗?您还可以帮助了解如何使用 DAO insert() 方法将员工姓名和技能保存到 EMPLOYEE_SKILLS 表中?

【问题讨论】:

  • 阅读休眠文档。
  • 不要认为您需要自己创建连接表 (EmployeeSkillsBean),您只需在 Employee 类上使用 @OneToMany
  • 所以你“面临困难”,但不要说它们是什么。例外?架构不映射?懒得看说明书?

标签: java spring hibernate jpa orm


【解决方案1】:
@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;

    @OneToMany(mappedBy="employee")
    private List<SkillsBean> skills;

    //Add Mappings here
}


@Entity
@Table(name="SKILLS")
public class SkillsBean implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="SKILL_NAME", unique = true)
    private String skillName;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="EMP_ID")
    private EmployeeBean employee;

    //Add your mappings here
}

我假设一名员工可以拥有多种技能

【讨论】:

  • 不确定谁投了反对票,但我的问题是,我们如何单独使用这些 bean 将记录添加到 EMPLOYEE_SKILLS 表中?我强烈觉得我们也需要第三个 bean。
  • Hibernate 将自己创建连接表。每当将 SkillBean 添加到 EmployeBean 的技能列表时,hibernate 将负责插入到第三个表中。不需要第三颗豆
  • 在这种情况下,DAO 插入方法将如何将名称和技能添加到 emp_skills 表?我已经编辑了我的查询,请帮忙。
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2012-02-02
相关资源
最近更新 更多