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

Java Hibernate 3.6自定义一对多映射的setter,java,hibernate,jpa,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<Us

我有一个简单的
@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;
}
public类成员(){
....
@OneToMany(fetch=FetchType.LAZY,mappedBy=“member”,orphan=true)
私人名单用户;
@短暂的
私人用户优先用户;
...
公共用户(列表用户){
//如果(users.size()>0)this.firstUser=users.get(0);
this.users=用户;
}
}
公共类用户(){
.....
@许多酮
@JoinColumn(name=“user\u id”)
私人会员;
}
如果映射的用户长度大于0,我想在这里设置
this.firstUser=users.get(0)
。但是,如果我像
Member
中的注释行那样将代码直接放入
setter
方法中,则不起作用,例如,我读取了一个
users
大小为5的成员对象,然后我尝试打印
firstUser
firstUser
仍然为空,预期结果应该是
users.get(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 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);
    }

}
public类成员(){
....
@OneToMany(fetch=FetchType.EAGER,mappedBy=“member”,orphan=true)
私人名单用户;
@短暂的
私人用户优先用户;
...
公共设置用户(列出用户){
如果(users.size()>0)this.firstUser=users.get(0);
this.users=用户;
}
@后装
public void setTransientUser(){
this.setUsers(this.users);
}
}

既然可以从列表中找到第一个用户,为什么还需要一个单独的firstUser?你的问题有点不清楚。“但是,当我将代码直接放入setter方法时,它不起作用”,您真的是指“如果我将代码直接放入setter方法,它就不起作用”吗?还有,它是怎么工作的?发生了什么事?@Magnilex我更新了描述。@user2710256我们不想更改前端代码,前端需要
firstUser
。@Magnilex事实上我还没有尝试序列化的方法,我通过调试发现
firstUser
为空,这意味着它没有被序列化,对吗?不,它没有被调用,但即使我将@Access(AccessType.PROPERTY)放在
用户
中,它仍然从未被调用过。您建议的第二种方法更好,但我们还必须修改前端代码,对吗?在前端,他们从JSON对象中读取属性,其中不存在
getFirstUser
方法。您是否使用JPA EntityManager?不,我使用的是基于SessionFactory的配置。使用SessionFactory,您可以使用hibernate拦截器/事件。有关更多信息,请访问:
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);
    }

}