java - 带有 @OneToMany 的随机 LazyInitializationException

标签 java hibernate jpa

我有一个包含以下表格的旧数据库:

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'”和代码=我的契约(Contract)中的类型。

我的问题是,如果我的警察有不止一份契约(Contract),我是随机的吗?获取 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升级到此版本,不再遇到异常。

关于java - 带有 @OneToMany 的随机 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29077392/

相关文章:

java - Spring + Hibernate + Redis 的分布式锁

java - 为序列化设置一个 transient 字段,但为 JPA 设置非 transient 字段

mysql - Hibernate 无法映射 MySQL varchar(255)

java - 如何用java将英语翻译成PigLatin(使用 boolean 值和字符串)

java - 从 session 监听器访问和修改应用程序范围的托管 Bean 的属性

java - Hibernate:持久化树状结构

java - 双向@OneToOne映射使用hibernate创建记录

java - 集群环境中 Spring session 范围 bean 和 Java 静态对象的行为

java - 使用返回值处理异常

java - DAO 方法参数、对象引用与 id