Hibernate获取子实体,尽管它不应该这样做

Hibernate获取子实体,尽管它不应该这样做,hibernate,jpa,Hibernate,Jpa,我使用OpenJDK11、JPA2.1和HibernateCore5.4.0.Final。 我有一个实体Ave,它有许多子关联,其中Bid和Buyer。 基数是: 1 Ave : Many Bid 1 Ave : Many Buyer 这是Ave实体的源代码摘录: @Entity @Table(name = "ave") @Access(AccessType.FIELD) public class Ave implements Serializable, SearchableEntity {

我使用OpenJDK11、JPA2.1和HibernateCore5.4.0.Final。 我有一个实体
Ave
,它有许多子关联,其中
Bid
Buyer
。 基数是:

1 Ave : Many Bid

1 Ave : Many Buyer
这是
Ave
实体的源代码摘录:

@Entity
@Table(name = "ave")
@Access(AccessType.FIELD)
public class Ave implements Serializable, SearchableEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", updatable = false, nullable = false)
private int id;


@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, targetEntity = Buyer.class)
@JoinColumn(name = "ave_id")
@Fetch(value = FetchMode.JOIN)
private Set<Buyer> allPotentialBuyers = new LinkedHashSet<>();


@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = Bid.class)
@JoinColumn(name = "ave_id")

@Fetch(value = FetchMode.JOIN)
private Set<Bid> bids = new HashSet<>();

// ... more code here ....
hibernate执行3(三)个SQL查询,尽管我不希望获取关联的
投标
买方

1.)第一次查询-获取
Ave
实体-确定:

04:34:15,717 INFO  [stdout] (default task-2) Hibernate: select ave0_.id as id1_0_, ave0_.angebotType as angebotT2_0_, ave0_.bidStep as bidStep3_0_, ave0_.bidwinner_id as bidwinne7_0_, ave0_.endDate as endDate4_0_, ave0_.home_id as home_id8_0_, ave0_.user_id as user_id5_0_, ave0_.startDate as startDat6_0_, ave0_.vertragsErrichter_id as vertrags9_0_ from ave ave0_ where ave0_.id=16
2.)Secodn查询-获取关联的
Bid
s-为什么?我不想要

04:34:15,928 INFO  [stdout] (default task-2) Hibernate: select bids0_.ave_id as ave_id3_4_0_, bids0_.id as id1_4_0_, bids0_.id as id1_4_1_, bids0_.abgabeDatum as abgabeDa2_4_1_, bids0_.ave_id as ave_id3_4_1_, bids0_.bidmaker_id as bidmaker6_4_1_, bids0_.bidPrice as bidPrice4_4_1_, bids0_.status as status5_4_1_, bids0_.vtgerrichter_id as vtgerric7_4_1_ from bid bids0_ where bids0_.ave_id=?
3.)第三个查询-获取关联的
买家
s-为什么?我不想:

04:34:16,082 INFO  [stdout] (default task-2) Hibernate: select allpotenti0_.ave_id as ave_id2_5_0_, allpotenti0_.id as id1_5_0_, allpotenti0_.id as id1_5_1_, allpotenti0_.ave_id as ave_id2_5_1_, allpotenti0_.contact_id as contact_3_5_1_, allpotenti0_.idx as idx4_5_1_, allpotenti0_.main_buyer_id as main_buy5_5_1_ from buyer allpotenti0_ where allpotenti0_.ave_id=?
  • Hibernate5.3+是JPA2.2标准
  • 您的获取策略-
    @Fetch(FetchMode.JOIN)
    覆盖
    FetchType.LAZY
    是您定义的。这让你的联想变得异常活跃 而不是懒惰
  • 因此,
    FetchMode.JOIN在获取实体时非常有用
    直接,通过其标识符或自然id

    另外,
    FetchMode.JOIN
    充当FetchType.EAGER策略。即使 我们将关联标记为
    FetchType.LAZY
    FetchMode.JOIN
    将 热切地载入协会

  • Hibernate5.3+是JPA2.2标准
  • 您的获取策略-
    @Fetch(FetchMode.JOIN)
    覆盖
    FetchType.LAZY
    是您定义的。这让你的联想变得异常活跃 而不是懒惰
  • 因此,
    FetchMode.JOIN在获取实体时非常有用
    直接,通过其标识符或自然id

    另外,
    FetchMode.JOIN
    充当FetchType.EAGER策略。即使 我们将关联标记为
    FetchType.LAZY
    FetchMode.JOIN
    将 热切地载入协会


    非常感谢。这真的不是直觉行为,但再次感谢你让我知道!接得好。这是否适用于
    FetchMode.JOIN
    仅限?有三种提取模式:JOIN、subselect和select。默认情况下,它是select,用于激发N+1查询以获取您的关联。Subselect用于生成子查询以选择关联的集合类型。join覆盖了懒惰的原因,它急切地使用join获取(我认为它使用的是一个左外连接,但必须阅读文档并做一些示例,然后我才能肯定地说)。你可以阅读我提到的文档,我必须做一些示例来检查事情是如何工作的,因为我从未使用过@Fetch。这是一个特定于hibernate的注释,我总是坚持使用JPA注释,除非没有其他出路。@PriyakDey非常感谢您的贡献!对我来说很奇怪,为什么其他帖子似乎没有提到这个事实,你能检查一下吗?例如:谢谢!这真的不是直觉行为,但再次感谢你让我知道!接得好。这是否适用于
    FetchMode.JOIN
    仅限?有三种提取模式:JOIN、subselect和select。默认情况下,它是select,用于激发N+1查询以获取您的关联。Subselect用于生成子查询以选择关联的集合类型。join覆盖了懒惰的原因,它急切地使用join获取(我认为它使用的是一个左外连接,但必须阅读文档并做一些示例,然后我才能肯定地说)。你可以阅读我提到的文档,我必须做一些示例来检查事情是如何工作的,因为我从未使用过@Fetch。这是一个特定于hibernate的注释,我总是坚持使用JPA注释,除非没有其他出路。@PriyakDey非常感谢您的贡献!对我来说很奇怪,为什么其他帖子似乎没有提到这个事实,你能检查一下吗?例如:您用JPA2.0和2.2两种语言标记问题。使用特定版本进行标记意味着您正在询问特定版本中的新功能。使用两个版本比使用JPA2.1更奇怪,因为您在第一段中声明使用JPA2.1。请更正。答案解决了你的问题吗?@Kukeltje我从标签上删除了版本信息,并将答案标记为“有用”和“已检查”,因为它直接指向文档中解释行为的位置。你用jpa 2.0和2.2标记了问题。使用特定版本进行标记意味着您正在询问特定版本中的新功能。使用两个版本比使用JPA2.1更奇怪,因为您在第一段中声明使用JPA2.1。请更正。答案解决了你的问题吗?@Kukeltje我从标签上删除了版本信息,并将答案标记为“有用”和“已检查”,因为它直接指向文档中解释行为的位置
    04:34:16,082 INFO  [stdout] (default task-2) Hibernate: select allpotenti0_.ave_id as ave_id2_5_0_, allpotenti0_.id as id1_5_0_, allpotenti0_.id as id1_5_1_, allpotenti0_.ave_id as ave_id2_5_1_, allpotenti0_.contact_id as contact_3_5_1_, allpotenti0_.idx as idx4_5_1_, allpotenti0_.main_buyer_id as main_buy5_5_1_ from buyer allpotenti0_ where allpotenti0_.ave_id=?