2015-12-16 93 views
2

我有以下場景:有公司和員工。每家公司都有一組員工。每個員工都可以爲幾家公司工作。所以,我實現了以下關係式:休眠兩個父母一個孩子映射

Company.class:

@JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "employee_id")) 
@ManyToMany(fetch = FetchType.LAZY) 
private List<Employee> employees; 

Employee.class:

@JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "employee_id") , inverseJoinColumns = @JoinColumn(name = "company_id")) 
@ManyToMany(fetch = FetchType.LAZY) 
private List<Company> companies; 

顯然,爲幾家公司工作,每個員工應該有分配給幾個不重疊的時間表他或她工作的每個公司。 此外,每個組合公司員工都應該有一個時間表列表,因爲有時舊時間表會過期,新時間表會生效。 所以我也有Schedule.class,這是應該有child to parent @ManyToOne關係既CompanyEmployee,並應工作方式如下:各Schedule,因此List<Schedule>應該對應CompanyEmployee實例只有一個組合。 如何實現這種關係?

更新1

我只記住添加@OneToMany Schedule關係到每個CompanyEmployee,但後來我需要把的Schedule兩個實例來CompanyEmployee每一次,而這種方式就是不看起來不錯,現在對我來說也不明顯,如何取回它。 所以任何幫助將不勝感激。


這個職位是更新,以顯示實際生活的場景我有,不只是通用ENTITY1,ENTITY2,ENTITY3名字的類。

更新2

我接受了答案,但我不能使用它,如果計劃包含列表。 根據我的計劃,Schedule應該包含List<Vacation>以瞭解一年以上的VacationsListDays,它們中的每一個都顯示特定的星期幾,休息時間和當天結束的開始。那些Days對於每個Schedule實例也是唯一的。

它應該是像下面的東西,但顯然現在我沒有schedule_id,所以如何將這些列表連接到Schedule

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name = "schedule_id") 
private List<Vacation> vacations; 

@JoinTable(name = "schedule_week", joinColumns = @JoinColumn(name = "schedule_id") , inverseJoinColumns = @JoinColumn(name = "day_id")) 
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) 
private List<Day> week; 

如何將這些列表包含在內?

+0

如果添加真實場景會更好。該解決方案可能與休眠不相關,但設計更改。 –

+0

@tharindu_DG我編輯了我的帖子以顯示真實場景。大概你是對的,希望它使事情更清楚。 –

回答

1

我想推薦以下解決方案。

一個embeddable類,其中包含特定時間表的CompanyEmployee

@Embeddable 
public class ScheduleOwner implements Serializable{ 

    @MapsId("id") 
    @ManyToOne(cascade = CascadeType.ALL) 
    Company c; 

    @MapsId("id") 
    @ManyToOne(cascade = CascadeType.ALL) 
    Employee e; 
} 

Schedule類嵌入ScheduleOwner實例。

@Entity 
public class Schedule { 

    @EmbeddedId 
    ScheduleOwner owner; 

    String description; 
} 

CompanyEmployee類(沒有做他們的變化)

@Entity 
public class Company { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "company_id") , inverseJoinColumns = @JoinColumn(name = "employee_id")) 
    @ManyToMany(fetch = FetchType.LAZY) 
    private List<Employee> employees; 
} 


@Entity 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "employee_id") , inverseJoinColumns = @JoinColumn(name = "company_id")) 
    @ManyToMany(fetch = FetchType.LAZY) 
    private List<Company> companies; 
} 

更新1

下面是你如何能保存和讀取結果。

Employee e1 = new Employee(); 
    Company c1 = new Company(); 
    c1.employees.add(e1); 

    e1.companies.add(c1); 

    ScheduleOwner so = new ScheduleOwner(); 
    so.c = c1; 
    so.e = e1; 

    Schedule s = new Schedule(); 
    s.owner = so; 

    session.save(c1); 
    session.save(e1); 
    session.save(s); 

    // below query will fetch from schedule, where company id = 9 
    Schedule ss = (Schedule) session.createQuery("From Schedule sh where sh.owner.c.id = 9").uniqueResult(); 

UPDATE 2

@Entity 
public class Company { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @JoinTable(name = "company_employee", joinColumns = @JoinColumn(name = "company_id", referencedColumnName="id") 
             , inverseJoinColumns = @JoinColumn(name = "employee_id", referencedColumnName="id")) 
    @ManyToMany(fetch = FetchType.LAZY) 
    List<Employee> employees = new ArrayList<>(); 

    String name; 
} 

@Entity 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "employees") 
    List<Company> companies = new ArrayList<>(); 

    String name; 
} 

@Entity 
public class Schedule { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    int schedule_id; 

    @ManyToOne 
    @JoinColumn(name = "company_id", insertable = false, updatable = false) 
    private Company company; 
    @ManyToOne 
    @JoinColumn(name = "employee_id", insertable = false, updatable = false) 
    private Employee employee; 

    String description; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "schedule") 
    List<Vacation> vacations; 

} 

@Entity 
public class Vacation { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int vacation_id; 

    @ManyToOne 
    @JoinColumn(name = "schedule_id") 
    Schedule schedule; 

    @OneToMany(mappedBy = "vacation") 
    List<Day> days; 
} 

Day實體直接涉及Vacation。不要Schedule

@Entity 
public class Day { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 


    @ManyToOne 
    @JoinColumn(name = "vacation_id") 
    Vacation vacation; 
} 

希望這會有所幫助。

+0

非常感謝您的幫助!我從來沒有使用'@嵌入式'功能。你能否進一步解釋一下,它應該如何在Java中工作?下面的一系列行動是否正確?設置:實例化Schedule,實例化ScheduleOwner(根據我的理解,它不應該有自己的表),從db獲取'Company'和'Employee',將'Company'和'Employee'設置爲' ScheduleOwner「,將'ScheduleOwner'設置爲'Schedule',將'Schedule'存儲到db。通過'employee_id'和'company_id'獲取'schedule' - 我現在不明白...這部分應該怎麼做?還會影響其他應用程序結構嗎? –

+0

另外,如果要這樣做,爲什麼不直接用'@ ManyToOne'關係(許多'Schedule'爲'Employee'和一個'Company')直接將'Employee'和'Company'放到'Schedule'中,而沒有這個中間'ScheduleOwner'類? –

+0

@Battle_Slug:我改變了設計並更新了我的答案。請檢查。閱讀此更多信息:http://stackoverflow.com/questions/19341838/why-should-we-use-embeddable-in-hibernate –