LazyInitializationException

LazyInitializationException

我有一个具有以下表的旧数据库:

Police
 id (PK)
 data...

Contract
 id(PK)
 version(PK)
 type


Code
 tab(PK)
 code(PK)
 name


我有一个JPA实体警察

@Entity
public class Police implements Serializable {


@Id
private long id

@OneToMany(fetch = FetchType.LAZY)
@JoinColumns(value = { @JoinColumn(name = "id", referencedColumnName = "id") })
private Set<Contract> contracts;

}


合同实体看起来像这样:

@Entity
public class Contract implements Serializable {


@Id
private long id;

@Id
private long version;


private String type;



@OneToMany(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "code", referencedColumnName = "type") })
@Where(clause = "tab = 'Type'")
private Set<Code> type;
}


码:

@Entity
public class Code implements Serializable {


    @Id
    private String tab;
    @Id
    private String code;

    private String name;
}


在代码表中,有许多用于不同应用程序的不同键/值。
在我的情况下,我需要一个,其中“ tab ='Type'”和代码=我合同中的类型。

我的问题是,如果我与警察有多个合同,我会随意吗?获取org.hibernate.LazyInitializationException。

在我的测试用例中,我执行以下操作:

public static void main(String[] args) {

    int countErrors = 0;

    for (int i = 0; i < 15; i++) {
        try {
            readPolice();
        } catch (Exception e) {
            e.printStackTrace();
            countErrors++;
        }
    }

    System.err.println("errors: " + countErrors);

}

private static void readPolice() throws Exception {
  EntityManagerFactory factory =     EntityManagerFactoryHelper.getFactory(PersistenceUnitsEnum.TEST_STAGE);
  EntityManager em = factory.createEntityManager();
  TypedQuery<Police> namedQuery = em.createNamedQuery(...);
  Police result = namedQuery.getSingleResult();
  Set<Contract> contracts = result.getContract();
  Contract contract = contracts.iterator().next();
  Set<Code> type = contract.getType(); //should be a set with one Entry

  System.out.println(type.size()); //<--- Chance for Exception!!
  em.close();
}


我将整个过程循环尝试15次。
在大约5-8次尝试中,我得到了LazyInitializationException。
其他时间它起作用。

有什么想法吗?为什么它不会一直失败?

最佳答案

刚遇到这个。关键字是“随机”。我的一位同事在她的笔记本电脑上始终遇到这种异常,而我从未遇到过。她只能在IE&Edge上重现异常。

最终意识到它与Tomcat版本有关。她运行的是旧版本,而我的运行是8.5.8。她将本地Tomcat升级到此版本,并且不再遇到例外。

10-01 20:22