java 链接到其他实体的Spring Jpa实体约定

e4eetjau  于 2023-05-15  发布在  Java
关注(0)|答案(1)|浏览(93)

我看到了一些将一个实体链接到其他实体的不同实现。例如,大多数带有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注解中是否接受第二个?我应该坚持第一个注解吗?

xienkqul

xienkqul1#

在计算机科学中,没有“适用于所有情况的最佳方法”,它在很大程度上取决于每个项目的具体细节。
首先,重要的是要注意,您的项目并不反映真实的的多对多关系,一家公司有许多员工,但员工可以同时在多家公司下注吗?在真实的世界中没有多大意义。
在定义这种关系时,我特别使用@ManyToMany。我尽量避免使用@JoinTable,因为它根本没有必要,你只需要使用这个注解,以防你想为连接表或它的列强制一个特定的名称,默认情况下hibernate会命名它们。
我从未见过任何人像您在第二个示例中那样定义数据模型,而且它肯定不能表示多对多关系
如果你把company_id放在employee实体中,你想如何表示拥有多个公司的员工?在数学上根本不可能
此外,通过使用long来设置关系中的foreignest键,世界上没有ORM工具能够为你解析和创建实体,你需要自己处理所有foreignest键,解析和Map你的实体,因为Hibernate无法猜测:

private Long employeeId;

表示一个foreignest键,它反映了第二个表中的id
最后但并非最不重要的是,除非绝对必要,否则严格不推荐使用@Query("anything", nativeQuery = true)。通过将查询定义为本地查询,您基本上扼杀了DBMS的互操作性,而这正是JPA的目的

相关问题