我有Spring经验,但是对于Hibernate来说是新的,在阅读了几篇教程和文章之后,我现在对一些观点太困惑了。请你澄清以下几个问题?
1.关于OneToMany关系,建议在表(例如Country表)中定义这种关系,而不是用country_id映射键来定义相关表(如Employee表)。但是,对于这种关系和其他关系,有不同类型的实现。
在Hibernate中,Uni或双向关系意味着什么?
你能给我举个例子或者给我一个好例子(除了那些也使我狡猾的文档),以便理解Hibernate中使用的所有关系吗?
2.用于ManyToMany关系,有些示例使用List<T>,而另一些则使用Set<T>、Collection<T>。那么,定义多个关系实体的正确方法是什么?
3.还有一些不必要的实现,例如@ManyToOne(fetch = FetchType.LAZY)或@JoinColumn(name = "book_id"),因为它们是默认实现。因此,据我所见,没有必要暗示这些默认设置,因为它们没有影响。这是真的吗?
发布于 2022-06-17 09:01:26
有许多选项,因为有许多不同的用例。
person_id上添加一个列PHONE_TABLE。
如果我们将其映射为单向一对多的话:
@Entity(name = " Person ") @Table(name="PERSON_TABLE")类person{ @Id私有Long id;@OneToMany(mappedBy = "Person")私有列表电话=新的ArrayList<>();} @Entity @Table(name="PHONE_TABLE")类电话{ @Id私有Long id;//该类中无多对一的
Hibernate创建了一个额外的表Person_Phone ( PHONE_TABLE和PERSON_TABLE之间的桥梁),其中包含了person_id和phone_id两列。@JoinColumn是可选的,当用户想要更改某些默认值时,这通常是必要的。例如,当您想要更改列名时,映射关联:
@Entity类Book { //默认列名将为author\_id,但我们将其更改为a\_id,//如果您对author_id没有意见,则@JoinColumn是不必要的@ManyToOne @JoinColumn(name = "a_id") Author };
关于@ManyToOne(fetch = FetchType.LAZY),Hibernate不能总是懒洋洋地获取多对一的关联。因此,默认情况是EAGER。当Hibernate延迟加载关联时,它会创建预期类的代理对象。问题是,您可能有这样的代码:
Book = session.find(Book.class,5);if ( book.getAuthor() == null ){ //做某事.}
如果Hibernate每次创建一个代理,getAuthor()将永远不会返回null。因此,如果hibernate可以猜测作者存在而不查询关联表,它将延迟加载它(例如,当指定关联始终存在时),否则它只会查询关联表并急切地创建对象。https://stackoverflow.com/questions/72655802
复制相似问题