在Hibernate / JPA 2.1中使用延迟加载的@OneToOne映射不起作用?

时间:2018-01-30 10:03:49

标签: java hibernate jpa jpa-2.0

我正在使用JPA 2.1和Hibernate进行实现。

举一个示例:

我有一个父实体(称之为Parent)和一个子实体(称之为Child)。

UniqueKey Embeddable:

<link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/jtblin/angular-chart.js/0.8.0/dist/angular-chart.css">
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.0/angular.min.js"></script>
<script src="https://rawgit.com/nnnick/Chart.js/v1.0.2/Chart.min.js"></script>
<script src="https://rawgit.com/jtblin/angular-chart.js/0.8.0/dist/angular-chart.min.js"></script>

<!--
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.3.0/Chart.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-chart.js/1.0.3/angular-chart.min.js"></script> 
    -->


<body ng-app="myApp" ng-controller="myController as ctrl">
  <canvas id="pie" class="chart chart-pie" chart-data="ctrl.data" chart-labels="ctrl.labels" chart-options="ctrl.options">
    </canvas>

</body>

家长实体:

@Embeddable
@EqualsAndHashCode
@Data
@NoArgsConstructor
public class UniqueKey implements Serializable {

    public UniqueKey(String id1, String id2) {
        this.id1 = id1;
        this.id2 = id2;
    }

    @Column(name = "id1")
    private String id1;

    @Column(name = "id2")
    private String id2;
}

儿童实体:

@Entity
@Table(name = "parent", uniqueConstraints = {
        @UniqueConstraint(columnNames = {
                "id1",
                "id2"
        })
})
public class Parent implements Serializable {
   @Id
   private UniqueKey key;

   @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "id1", referencedColumnName = "id1", insertable = false,
                    updatable = false),
            @JoinColumn(name = "id2", referencedColumnName = "id2", insertable = false,
                    updatable = false)
    })
    private Child child;
}

对于父母的一些查询我需要孩子,在某些情况下我不需要。

我试图通过uniqueKey获取但不是调用getChild(),但它仍然是与父级一起获取子数据。

在提到this answer之后。它说在@OneToOne的情况下它总是急切地获取数据,即使我们定义fetch = FetchType.LAZY。因为这是非常古老的答案所以我不知道它是否也发生在JPA 2.1中。

  

如果它也发生在JPA 2.1中,那么Fetch lazy的其他方式是什么   使用JPA criteriaBuilder?

1 个答案:

答案 0 :(得分:0)

  1. 实际工作的懒惰@OnetoOne关系
  2. 如果您需要从父级中选择UniqueKey而不提取孩子 - 您可以尝试以下操作:

    class UniqueKeyDto {   private String s1;   private String s2;   UniqueKeyDto(String s1,String s2){     //省略   } }

  3. 然后像这样使用JPQL查询:

    SELECT NEW UniqueKeyDto(p.child.key.s1, p.child.key.s2) FROM Parent p WHERE <conditions here>
    

    这个查询显然可以优化,但我不确定哪些JPA实现可以实现这一点。

    如果您的实现不支持这种优化,那么您的方式是本机查询。有时候进行原生查询非常好:)