想要的建议 - SPRING JPA JoinColumns

时间:2015-04-15 12:50:44

标签: java spring hibernate jpa joincolumn

刚开始探索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>

2 个答案:

答案 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之间创建外部主要关系。 这将使您的代码看起来整洁。

希望这有帮助。