我有一个简单的@OneToMany
映射:
public class Member(){
....
@OneToMany(fetch = FetchType.LAZY, mappedBy="member", orphanRemoval=true)
private List<User> users;
@Transient
private User firstUser;
...
public setUsers(List<User> users){
//if(users.size() > 0) this.firstUser = users.get(0);
this.users = users;
}
}
public class User(){
.....
@ManyToOne
@JoinColumn(name = "user_id")
private Member member;
}
如果映射的用户长度大于0,我想设置this.firstUser = users.get(0)
。但是,如果我将代码直接放入setter
方法(如注释行中),则无效例如,Member
我读了users
大小为5的成员对象,然后我尝试打印firstUser
,firstUser
仍为空,预期结果应为{{ 1}}。
有什么想法吗?
答案 0 :(得分:0)
你确定实际上是在调用setter吗?默认情况下,如果 @Id 或 @EmbeddedId 位于某个字段上,则会通过该字段访问该状态,并且不会调用setter。如果是这种情况,你可以在关系上使用@Access(AccessType.PROPERTY)
来强制Hibernate使用setter而不是反射:
@OneToMany(fetch = FetchType.LAZY, mappedBy="member", orphanRemoval=true)
@Access(AccessType.PROPERTY)
private List<User> users;
无论如何,在你的情况下,这样做可能是一个坏主意。你真的需要这个领域吗?你应该能够使用它:
public User getFirstUser()
{
return users != null && !users.isEmpty() ? users.get(0) : null;
}
答案 1 :(得分:0)
您可以尝试以下方法:
public class Member(){
....
@OneToMany(fetch = FetchType.EAGER, mappedBy="member", orphanRemoval=true)
private List<User> users;
@Transient
private User firstUser;
...
public setUser(List<User> users){
if(users.size() > 0) this.firstUser = users.get(0);
this.users = users;
}
@PostLoad
public void setTransientUser() {
this.setUsers(this.users);
}
}