user_table{
id
...
}
calendar{
id
...
}
user_calendar_details (
id BIGSERIAL PRIMARY KEY,
user_id NOT NULL,
calendar_id NOT NULL,
CONSTRAINT user_calendar_uk UNIQUE (user_id, calendar_id),
user_id BIGINT REFERENCES user_table (id),
calendar_id BIGINT REFERENCES calendar (id)
);
CREATE TABLE calendar_details (
id BIGSERIAL PRIMARY KEY,
user_calendar_details_id BIGSERIAL,
CONSTRAINT user_calendar_det_uk UNIQUE (user_calendar_details_id),
user_calendar_details_id BIGINT REFERENCES user_calendar_details (id)
...
);
请求日历信息仅为请求数据的用户加载实体。 (user_id
可以从安全上下文中获取)
对于每个calendar
核心实体,只应加载一个映射表结果user_calendar_details
和一个calendar_details
。
我打算在这里考虑下一个案例之一:
实现实体模型以在@OneToMany
实体中使用Calendar
映射,在内部集合中我们可以拥有UserCalendarDetails
个实体集。如果加载(UserCalendarDetails
)集合,则应对其进行过滤,并且只包含一个对象UserCalendarDetails
(因为限制请参见上部user_calendar_uk
)。在这种情况下,我需要在DB请求时间内以userId指定子集合过滤器的单独方式加载Calendar
和UserCalendarDetails
两个db请求。
尝试使用hibernate继承
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = “user_id”)
user_calendar_details
和实体模型映射应为@OneToOne
(Calendar
和user_calendar_details
之间)。
使用联接中的限制的低级别数据库请求的一些想法。这似乎是解决我的问题(处理它)的最真实有效的方法。
我调查了这个想法,我的结论是不可能的,但我可能会弄错。我在stackoverflow上也检测到类似的想法,但没有正面答案。请确认我的结论或帮助解决此问题的想法(可能是示例)。
我不清楚是否有可能。如果以const方式使用,我会使用@DiscriminatorValue(“myConcreteUserId”)
。但它应该以动态的方式使用。我还没有想法,怎么做。有什么想法吗?
如何使用@OneToOne
使用user_calendar_details
映射以级联方式保存日历实体(请记住:在每个calendar
的数据库中,我们可以在user_calendar_details
中有几行,但是为用户加载应该每次只有一个)?
答案 0 :(得分:0)
据我所知......数据模型如下: 1用户与用户日历详细信息有一对多的关系(这种关系是双向的,因此用户日历详细信息也与用户有多对一的关系)
2个用户日历详细信息与日历有多对一关系(此关系也可以是双向的,因此日历与用户日历详细信息有一对多的关系)
3个用户日历详细信息与日历详细信息有一对一的关系(我想您可能会考虑将它们合并到一个表中......但这取决于要求)
现在让我们以相同的方式设置域模型,用户日历详细信息将与日历和一对一关系具有一对一的关系。到日历细节....所以你只需要通过用户id(使用条件或查询或用I&#d; d构建的用户对象)加载用户日历详细信息,并且将急切地加载一对一的关系。默认(不是两个查询...只有一个),因此您将获得相关的日历和日历详细信息对象