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

Hibernate - OneToMany - 多列

Hibernate 从 onetomany 中删除