Hibernate 在多对多关系中避免不必要的连接
我的数据库中有两个表,分别是Hibernate 在多对多关系中避免不必要的连接,hibernate,jpa,many-to-many,Hibernate,Jpa,Many To Many,我的数据库中有两个表,分别是media\u blog和media\u category。第三个表名为media\u blog\u category,它将博客与其所属的类别关联起来(一个博客可以属于多个类别,一个类别可能包含多个博客)。此关系在Hibernate/JPA中映射如下: @Entity @Table(name="media_blog") public class Blog { @Column(name="name") private String name;
media\u blog
和media\u category
。第三个表名为media\u blog\u category
,它将博客与其所属的类别关联起来(一个博客可以属于多个类别,一个类别可能包含多个博客)。此关系在Hibernate/JPA中映射如下:
@Entity
@Table(name="media_blog")
public class Blog {
@Column(name="name")
private String name;
@ManyToMany(fetch = FetchType.LAZY, targetEntity=MediaCategory.class)
@JoinTable(name = "media_blog_category",
joinColumns = {@JoinColumn(name = "blog_id")},
inverseJoinColumns = {@JoinColumn(name = "media_category_id")}
)
private Set<MediaCategory> categories;
// Here goes the setters and getters for fields name and categories
}
@Entity
@Table(name="media_category")
public class MediaCategory {
@Column(name="name")
private String name;
@ManyToMany(fetch = FetchType.LAZY, mappedBy="categories")
private List<Blog> blogs;
// Here goes the setters and getters for fields name and blogs
}
字段类别上设置的延迟提取类型按预期工作,因为没有查询类别信息
但是,在执行设置blogcontegories=b.getCategories()时会执行以下查询:
问题是我只对类别id感兴趣(表media\u blog\u category
中的字段media\u category\u id
),但我注意到查询与media\u category
表连接,并检索每个类别的所有字段(在本例中,字段name
,但将来会有更多字段)以填充MediaCategory对象。有一个性能损失,因为它是通过连接来获取我不打算使用的信息
有没有一种方法可以避免Hibernate执行此联接,因此它使用MediaCategory代理填充上面的变量blogCategories
(其中只有id
字段可用-这就是我所需要的),并将对其余类别字段的检索延迟到调用“getName()”(或另一列getter)的时刻MediaCategory代理对象的名称
我想做的和这篇文章中的类似:
但是对于多对多的关系。
我尝试过那篇文章中所示的方法,所以用@AccessType(“property”)
注释了类mediacegory
中的id
字段,但它不起作用。它似乎不适合多对多的关系,而只适合一对一的关系
谢谢
select blog0_.id as id11_0_, blog0_.name as name11_0_
from media_blog blog0_ where blog0_.id=?
select categories0_.blog_id as blog1_11_1_,
categories0_.media_category_id as media2_1_,
mediacateg1_.id as id2_0_,
mediacateg1_.name as name2_0_
from media_blog_category categories0_
inner join media_category mediacateg1_
on categories0_.media_category_id=mediacateg1_.id
where categories0_.blog_id=?