刚开始探索SPRING和JPA。请耐心等待我。
假设我有两张桌子
EMPLOYEE TABLE ATTACHMENT TABLE --------------------------- ------------------------------------------- ID | FIRSTNAME | LASTNAME | ID | REF_TYPE | REF_ID | FILE --------------------------- ------------------------------------------- 1 | EMP1 | EMPL1 | 1 | "EMPLOYEE" | 1 | EMPL1_FIle1.jpg --------------------------- ------------------------------------------- 2 | EMP2 | EMPL2 | 2 | "EMPLOYEE" | 1 | EMPL1_FIle2.jpg ------------------------------------------- 3 | "EMPLOYEE" | 2 | EMPL2_FIle1.jpg
**为了保持附件灵活(因此我可以在需要附件的其他地方重复使用相同的表/类),我使用 REF_TYPE 和 REF_ID的组合找到引用对象。 的
最好的方法是什么?
- 应该这样做吗? DB / Class设计有更好的方法吗?
- 我应该使用@JoinColumns吗? (但我不确定这是怎么回事......)
- 或者加载附件的逻辑是否应该进入Service / DAO类,其中 findByRefTypeAndRefId(String refType,long refId)函数会回退到JPARepository @Autowired 接口? / p>
答案 0 :(得分:0)
您将无法在JPA中映射此类关系。
OneToMany或ManyToOne映射(从员工到附件或员工的附件)是基于@ID的。您的员工只有一个列ID,但在您的附件中,联接取决于两列的值。
答案 1 :(得分:0)
假设您的附件表中包含其他表格(包括员工)的记录,例如公司等。
首先,您必须编写JPA查询,@ JoinColumns不起作用,因为您不应将一个列映射映射到两个表作为外部 - 主要关系。
加载任何数据库查询的逻辑应始终转到DAO类。你应该遵循,服务和DAO模式来简化代码。
解决方法1: 如果您想使用当前方法,请使用JPA查询+您的列类型REF_TYPE作为CHAR(1),例如E,C等
溶液2: 为附件(用户,公司等)创建单独的表,删除REF_TYPE列。在id列和使用join之间创建外部主要关系。 这将使您的代码看起来整洁。
希望这有帮助。