休眠 - 字段懒惰获取



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

你可以

@Basic(fetch = FetchType.LAZY)

但是要在您的领域工作,您必须启用休眠字节码增强器(一些背景故事)

        <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。

你需要

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

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

FetchType.LAZY不会自动加载类。 @JsonIgnore阻止类位于 JSON 中。

假设您想加载除密码之外的所有变量。您需要做的是将@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
}

最新更新