Hibernate @OneToMany 的意外行为
Posted
技术标签:
【中文标题】Hibernate @OneToMany 的意外行为【英文标题】:Unexpected behavior with Hibernate @OneToMany 【发布时间】:2015-03-05 10:46:59 【问题描述】:我是使用 spring-boot 的 JPA 的新用户,所以这个问题可能看起来很幼稚。 我有两个非常简单的实体:
@Entity
@Table(name="RATEPLAN")
public class RatePlan implements Serializable
@Id
@GeneratedValue
@Column(name="RPCODE")
private Long id;
@Column(name="DESCRIPTION",nullable = false)
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(
name="RPSP",
joinColumns = @JoinColumn( name="RPCODE"),
inverseJoinColumns = @JoinColumn( name="SPCODE")
)
private List<ServicePackage> servicePackages;
和
@Entity
@Table(name="SERVICEPACKAGE")
public class ServicePackage
@Id
@GeneratedValue
@Column(name="SPCODE")
private long id;
public long getId()
return id;
我正在寻找的行为是我想使用 FetchAll() 原语获取包含至少一个服务包的所有 RatePlan 作为 SQL 中的简单 JOIN。
当我打印 Hibernate 生成的 SQL 时,首先它会获取所有 RatePlan,然后为每个 rateplan 查找关联的 ServicePackage。 结果是我提供了没有任何相关服务包的费率计划,这是我不想要的。 (好像我使用了选择外连接)。
我看到在 Service Package 类中插入 ratePlan (ManyToOne) 的引用可以解决问题。但我认为在这里复制对象没有任何意义。你有其他解决方案吗?
谢谢。
【问题讨论】:
【参考方案1】:您需要这样做以过滤掉空的服务包。
Query query = session.createQuery("from RatePlan plan fetch all properties where plan.servicePackages is not empty");
【讨论】:
谢谢,我完全明白这个HQL的作用,但是我真的不知道在哪里使用它。 终于找到了,非常好用谢谢@arunm以上是关于Hibernate @OneToMany 的意外行为的主要内容,如果未能解决你的问题,请参考以下文章
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1
HIbernate“StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1”
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期的
org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1