Java JPA实体在访问实体类中的其他方法时加载惰性集合

Java JPA实体在访问实体类中的其他方法时加载惰性集合,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个父子实体(一方及其账户),代码如下所述。参与方与帐户及其帐户有一对多关系。我的问题是,当我加载PartyEntity并调用它的test方法时,那么为什么JPA(hibernate)会加载延迟加载的帐户。我没有访问测试方法中的帐户: @Entity @Table(name = "PARTY") public class PartyEntity { @Id @Column(name = "PARTY_ID") private String partyId;

我有一个父子实体(一方及其账户),代码如下所述。参与方与帐户及其帐户有一对多关系。我的问题是,当我加载PartyEntity并调用它的test方法时,那么为什么JPA(hibernate)会加载延迟加载的帐户。我没有访问测试方法中的帐户:

@Entity
@Table(name = "PARTY")
public class PartyEntity {
    @Id
    @Column(name = "PARTY_ID")
    private String partyId;

    @OneToMany(mappedBy = "party", orphanRemoval = true)
    private Set<PartyAccount> accounts = new HashSet<>();   

    public String getPartyId() {
        return partyId;
    }

    public void setAccounts(Set<PartyAccount> partyAccounts) {
        this.accounts = partyAccounts;
    }

    //**Call to this method executes query to fetch accounts**
    public void test() {
        System.out.println("test");
    }
}
@实体
@表(名称=“一方”)
公共类派对实体{
@身份证
@列(name=“PARTY\u ID”)
私有字符串partyId;
@OneToMany(mappedBy=“party”,orphan=true)
私有集合帐户=新HashSet();
公共字符串getPartyId(){
返回partyId;
}
公共作废设置帐户(设置partyAccounts){
this.accounts=partyAccounts;
}
//**对该方法的调用执行查询以获取帐户**
公开无效测试(){
系统输出打印(“测试”);
}
}

当您声明为
私人设置帐户时,它是否会更改(即删除
新HashSet()
)?为什么不查看日志?发布访问代码,当您输入该方法时在日志中放一行,当您退出该方法时在日志中放一行……您确定帐户正在加载吗?也显示PartAccount代码。@Alexalauyou这绝对是错误的答案,集合必须初始化。@Amalgovinus如果在事务边界中使用,则单位化集合是可以的--这正是
PersistentSet
的目的,
PersistentBag
implementations。当您声明为
private Set帐户时,它是否会更改(即删除
新HashSet()
)?为什么不查看日志?发布访问代码,当您输入该方法时在日志中放一行,当您退出该方法时在日志中放一行……您确定帐户正在加载吗?也显示PartAccount代码。@Alexalauyou这绝对是错误的答案,集合必须初始化。@Amalgovinus如果在事务边界中使用,单元化集合是可以的——这正是
PersistentSet
PersistentBag
实现的目的。