【问题标题】:Hibernate @OneToMany relationship休眠@OneToMany 关系
【发布时间】:2017-05-29 13:33:09
【问题描述】:

@OneToMany 关系有些问题。 第一个实体代表某种商品。

@Entity(name = "ARTIQULE")
public final class ArtiquleEntity extends CustomEntity{

@Id
@Column(name = "ID")
public Long id;

@NotNull
@Column(name = "METRIC_ID")
public Long metricId;

@NotNull
@Column(name = "STATUS_ID")
public Long statusId;

@NotNull
@Column(name = "NAME")
public String name;

@NotNull
@Column(name = "SHORT_NAME")
public String shortName;

@NotNull
@ManyToOne
@JoinColumn(name = "GROUP_ID")
public ArtGroupEntity artGroup;
}

二是商品分组

@Entity(name = "AR_GROUP")
public final class ArtGroupEntity extends CustomEntity {

@Id
@Column(name = "ID")
public Long id;

@NotNull
@Column(name = "GROUP_ID")
public Long groupId;

@NotNull
@Column(name = "STATUS_ID")
public Long statusId;

@NotNull
@Column(name = "NAME")
public String name;

@NotNull
@Column(name = "L")
public Integer left;

@NotNull
@Column(name = "R")
public Integer right;

@NotNull
@OneToMany(mappedBy = "artGroup", fetch = FetchType.EAGER)
public List<ArtiquleEntity> artiquleEntities;
}

当我进行“从 AR_GROUP 列表中选择列表”之类的选择时。 Hibernate为每个组创建一个选择,为什么不使用外连接? 或者是不可能的。

Hibernate: select artgroupen0_.ID as ID1_0_, artgroupen0_.GROUP_ID as GROUP_ID2_0_, artgroupen0_.L as L3_0_, artgroupen0_.NAME as NAME4_0_, artgroupen0_.R as R5_0_, artgroupen0_.STATUS_ID as STATUS_I6_0_ from AR_GROUP artgroupen0_
Hibernate: select artiquleen0_.GROUP_ID as GROUP_ID2_1_0_, artiquleen0_.ID as ID1_1_0_, artiquleen0_.ID as ID1_1_1_, artiquleen0_.GROUP_ID as GROUP_ID2_1_1_, artiquleen0_.METRIC_ID as METRIC_I3_1_1_, artiquleen0_.NAME as NAME4_1_1_, artiquleen0_.SHORT_NAME as SHORT_NA5_1_1_, artiquleen0_.STATUS_ID as STATUS_I6_1_1_ from ARTIQULE artiquleen0_ where artiquleen0_.GROUP_ID=?
Hibernate: select artiquleen0_.GROUP_ID as GROUP_ID2_1_0_, artiquleen0_.ID as ID1_1_0_, artiquleen0_.ID as ID1_1_1_, artiquleen0_.GROUP_ID as GROUP_ID2_1_1_, artiquleen0_.METRIC_ID as METRIC_I3_1_1_, artiquleen0_.NAME as NAME4_1_1_, artiquleen0_.SHORT_NAME as SHORT_NA5_1_1_, artiquleen0_.STATUS_ID as STATUS_I6_1_1_ from ARTIQULE artiquleen0_ where artiquleen0_.GROUP_ID=?
Hibernate: select artiquleen0_.GROUP_ID as GROUP_ID2_1_0_, artiquleen0_.ID as ID1_1_0_, artiquleen0_.ID as ID1_1_1_, artiquleen0_.GROUP_ID as GROUP_ID2_1_1_, artiquleen0_.METRIC_ID as METRIC_I3_1_1_, artiquleen0_.NAME as NAME4_1_1_, artiquleen0_.SHORT_NAME as SHORT_NA5_1_1_, artiquleen0_.STATUS_ID as STATUS_I6_1_1_ from ARTIQULE artiquleen0_ where artiquleen0_.GROUP_ID=?

感谢回复。

【问题讨论】:

  • 我认为问题将是选择执行后必须完成的 OR-Mapping
  • 更改 @ManyToOne 对 @ManyToOne(optional = false) 看看会发生什么

标签: java hibernate


【解决方案1】:

多个正在运行的查询可能是因为 n + 1 问题。

使用JOIN FETCH 在一个查询中获取父实体和所有映射的子实体。

查看this 类似的答案。

【讨论】:

  • 如果它对您有所帮助,请给予应有的赞誉。还可以将其标记为已接受,以后可以被其他人接收。
【解决方案2】:

使用 hql join fetch 解决的问题, 在我的选项中选择看起来像这样

from AR_GROUP list left outer join fetch list.artiqules

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多