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