我看到了一些将一个实体链接到其他实体的不同实现。例如,大多数带有hibernate的Jpa使用关系注解,例如:
@Entity
@Data
public class Employee {
//id
.....
@JoinTable(...)
@ManyToMany
Set<Company> companies;
}
@Entity
@Data
public class Company {
//id
.....
@JoinTable(...)
@ManyToMany
Set<Employee> employees;
}
但在某些情况下,这是使用:
@Entity
@Data
public class Employee {
//id
.....
private Long companyId;
}
@Entity
@Data
public class Company {
//id
private Long employeeId;
}
然后在相应的存储库接口中使用@Query(value="SELECT ... FROM ... WHERE employeeId / companyId =: ....", nativeQuery = true)
扩展JpaRepository来选择具有特定fk的员工/公司<....>。
哪个更好?我知道很多教程使用第一个,但我认为第二个似乎更容易?话虽如此,jpa注解中是否接受第二个?我应该坚持第一个注解吗?
1条答案
按热度按时间xienkqul1#
在计算机科学中,没有“适用于所有情况的最佳方法”,它在很大程度上取决于每个项目的具体细节。
首先,重要的是要注意,您的项目并不反映真实的的多对多关系,一家公司有许多员工,但员工可以同时在多家公司下注吗?在真实的世界中没有多大意义。
在定义这种关系时,我特别使用
@ManyToMany
。我尽量避免使用@JoinTable
,因为它根本没有必要,你只需要使用这个注解,以防你想为连接表或它的列强制一个特定的名称,默认情况下hibernate会命名它们。我从未见过任何人像您在第二个示例中那样定义数据模型,而且它肯定不能表示多对多关系
如果你把company_id放在employee实体中,你想如何表示拥有多个公司的员工?在数学上根本不可能
此外,通过使用long来设置关系中的foreignest键,世界上没有ORM工具能够为你解析和创建实体,你需要自己处理所有foreignest键,解析和Map你的实体,因为Hibernate无法猜测:
表示一个foreignest键,它反映了第二个表中的id
最后但并非最不重要的是,除非绝对必要,否则严格不推荐使用
@Query("anything", nativeQuery = true)
。通过将查询定义为本地查询,您基本上扼杀了DBMS的互操作性,而这正是JPA的目的