JPA嵌套集合

时间:2017-09-15 11:06:47

标签: java hibernate jpa enums relational-database

我正在努力将商店的时间表保存到数据库中。

public class Shop {
   @Id
   private long id;
}


public class Schedule {
   @Id
   private long id;

   @Column
   @Enumerated(EnumType.STRING)
   private DayOfWeek weekday;

   @Column(name="time_from")
   private Time from;

   @Column(name="time_to")
   private Time to;      

   @ManyToOne
   @JoinColumn(name="shop_id")
   private Shop shop;

}

我想要的是在Shop实例中提供时间表(一个商店可以有多个tofrom次,例如09:00-13:00,14:00-18: 00),像这样

public class Shop {
   @Id
   private long id;

   private Map<DayOfWeek, List<Schedule>> scheduleList = new HashMap<>();
}

但我不知道如何映射。我正在浏览JPA 2.1维基页面(https://en.wikibooks.org/wiki/Java_Persistence/Relationships#Nested_Collections.2C_Maps_and_Matrices),但条件字段是ENUM,我认为没有理由创建一个包含7行的额外表格(对于每个工作日)。有没有人使用这些功能?

编辑:可能的解决方案是将工作日划分为单独的表格:

餐厅

ID

表week_day

ID 名称 shop_id

表时间

ID time_from time_to week_day_id

在这种情况下,来自wiki的示例可以使用,但有没有使用任何解决方案而不是中间表只是枚举?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Java 8,那么您可以在Shop对象

中使用简单的反OneToMany关系访问商店的时间表
@OneToMany
private List<Schedule> scheduleList;

然后创建一个类似

的方法
public Map<DayOfWeek, List<Schedule>> getScheduleListByDaysOfWeek() {
    return scheduleList.stream()
        .collect(Collectors.groupingBy(Schedule::getWeekday);
}