Hibernate @OneToMany出现意外行为

时间:2015-03-05 10:46:59

标签: spring hibernate jpa spring-boot hibernate-onetomany

我是JPA的新用户,使用spring-boot,所以这个问题看起来很天真。 我有两个非常简单的实体:

@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()原语在SQL中将包含至少一个servicepackage的所有RatePlan作为一个简单的JOIN获取。

当我打印Hibernate生成的SQL时,首先它获取所有RatePlan,然后为每个rateplan查找关联的ServicePackage。 结果是我得到的费率计划没有任何关联的服务包,这是我不想要的。 (好像我使用了一个选择外连接)。

我看到在Service Package类中插入ratePlan(ManyToOne)的引用可以解决问题。但我在这里看不到任何重复对象的意义。你有其他解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您需要执行此操作以过滤掉空的服务包。

Query query = session.createQuery("from RatePlan plan  fetch all properties where plan.servicePackages is not empty");