Hibernate 3.6自定义一对多映射的setter

时间:2015-05-15 09:20:43

标签: java hibernate jpa

我有一个简单的@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的成员对象,然后我尝试打印firstUserfirstUser仍为空,预期结果应为{{ 1}}。

有什么想法吗?

2 个答案:

答案 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);
    }

}