在Java实体中映射联结表数据的最佳方法是什么?

时间:2014-04-21 22:57:43

标签: java hibernate orm

我有三张桌子,展示了我非常简单的项目。

CREATE TABLE company (
  id   INT          NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(250) NOT NULL
);

CREATE TABLE employee (
  id   INT          NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(250) NOT NULL
);

CREATE TABLE company_employee (
  company_id  INT NOT NULL,
  employee_id INT NOT NULL,
  hire_date   DATE DEFAULT NULL,
  resign_date DATE DEFAULT NULL,
  FOREIGN KEY (company_id) REFERENCES company (id),
  FOREIGN KEY (employee_id) REFERENCES employee (id)
);

我有Java表示

@Entity
@Table(name = "employee")
public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Integer id;

    @Column(name = "name")
    String name;

    @ManyToMany(mappedBy = "employees")
    private List<Company> companies;


@Entity
@Table(name = "company")
public class Company implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

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

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "company_employee",
               joinColumns = {@JoinColumn(name = "company_id")},
               inverseJoinColumns = {@JoinColumn(name = "employee_id")})
    private Collection<Employee> employees;

我无法弄清楚我可以存储历史数据的位置。在历史数据中,我需要存储hire_date,resign_date of emplyee以及存储每个emplyee的所有公司。所以我的问题是,我可以管理这样的中介,以及存储所有历史信息的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

这是与属性的多对多关系。我相信你将能够通过一个基本的例子来理解谁来处理它:

http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

答案 1 :(得分:0)

您已经有一个交叉表&#34; company_employee&#34;。

您可以在此处存储employee1 1.1.2013至31.12.2013 @ company1。另一次是1.1.2014 ... 31.12.2014 @ company2。

您必须通过hire_date desc订购。根据定义,列表中的第一个值是当前或最后一个就业,所有其他值都是历史记录。

这不是存储位置的问题,而是如何读取数据。