【发布时间】:2020-11-20 13:53:24
【问题描述】:
考虑下表结构和关系。
Teacher
id(pk),
tname,
subject_id(fk),
subject_name
Subject
sid(pk),
sname,
subject_learning_curve
TEACHER(关系所有者)到 SUBJECT 多对一,双向关系
我在 intellij 中使用了持久化工具窗口here。它基于数据源自动为数据库中的所有关系生成实体。
在实体中是这样生成的
@Entity
//using lombok for getters and setters
public class TEACHER{
@Id
@GeneratedValue
private Long id;
private String tname;
private long subject_id;
private String subject_name;
@ManyToOne
@JoinColumn(name = "subject_id",referencedColumnName="sid")
private Subject subjectBySid; //is this fine to have a reference like this
}
或下面的第二种方法
@Entity
//using lombok for getters and setters
public class Teacher{
@Id
@GeneratedValue
private Long id;
private String tname;
@ManyToOne
@JoinColumn(name = "subject_id",referencedColumnName="sid")
private Subject subject; //or just this it will suffice all use case,like if i just want to read Teacher data and just the sid not the whole subject row
}
同样,Subject 也会有指向 Teacher 表的参考。
根据以下几点,有人可以提供见解。
- 以上两种写实体的方式中哪一种是理想且正确的。
- 从 Hibernate 和 JPA 的角度来看哪个更有效。
- 根据我选择编写实体的方法生成的 sql 会有什么不同吗?
- 如果我采用第二种方法,查询记录并将其保存到数据库或检索会更容易。
- 当我在 Entity 中获取数据时,TEACHER 中的 subject_id 是否有价值,或者它只是一个名为 subject 的引用,我不会在 TEACHER.subject_id 或
@JoinColumn(name = "subject_id",referencedColumnName="sid")注释中获取该特定字段,并且它应该在 TEACHER.subject_id 中具有价值
【问题讨论】:
-
只是为了澄清。您确定要将
Teacher和Subject映射为多对一,反之亦然吗?通常Teacher会讲几门课。 -
是的,这只是例如背后没有特定的逻辑。您可以想到任何多对一关系,多方是关系的所有者。
-
还有更多的浏览量吗?
-
我肯定会选择第二种方法——坦率地说,我从未在任何项目中见过第一种方法。第一个包含冗余信息,(它违反了 DB 标准形式之一——我认为是 2NF)。如果您采用第一种方法,您将不得不同步冗余数据 - 没有意义。首先,使用两个单独的表/实体更自然,从性能的角度来看,您不会丢失任何东西,因为您将在
subject表中的teacher外键上拥有索引。
标签: java database hibernate jpa spring-data-jpa