Hibernate- Fields Lazy Fetching

时间:2017-01-16 13:00:16

标签: hibernate lazy-loading hibernate-mapping

如何添加限制以仅从实体加载所需的字段? 我的User表具有CustomerUser OneToOne映射和Transaction表,其中User为OneToOne maping 因此,当我加载事务时,它加载用户和相应的客户,但我不想从customeruser表加载密码和一些其他文件。 (Hibernate版本4.2.6)

2 个答案:

答案 0 :(得分:1)

你可以用

做到这一点
@Basic(fetch = FetchType.LAZY)

但要想在你的领域工作,你必须启用Hibernates Bytecode Enhancer(some back story

        <plugin>
            <groupId>org.hibernate.orm.tooling</groupId>
            <artifactId>hibernate-enhance-maven-plugin</artifactId>
            <version>${hibernate.version}</version>
            <executions>
                <execution>
                    <configuration>
                        <failOnError>true</failOnError>
                        <enableLazyInitialization>true</enableLazyInitialization>
                        <enableDirtyTracking>true</enableDirtyTracking>
                    </configuration>
                    <phase>compile</phase>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

另一种方法是将两个实体映射到同一个表。就像CustomerUser可能已经映射了所有始终加载的字段一样,但CustomerPassword只有id和密码本身。然后,您只需在服务/存储库中需要时加载密码实体。

在修复延迟属性票证之前,这是常见的解决方法。花了3年时间:P。

答案 1 :(得分:1)

您需要做的是编写Json注释和获取类型。 例如:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JsonIgnore
private CustomerUser customerUser;

FetchType.LAZY不会自动加载该类。 @JsonIgnore阻止该类进入json。

或者,

假设您要加载CustomerUser以及除密码之外的所有变量。您需要做的是将@JsonIgnore添加到密码变量。

public class User {
       ....
      @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
      @JsonManagedReference
      private CustomerUser customerUser;
      ....
}

public class CustomerUser {

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

       @Column(name = "password")
       @JsonIgnore
       private String password;
       ......
       ...getters/setters
}