У меня есть наследие базы данных со следующими таблицами:Случайные LazyInitializationException с @OneToMany
Police
id (PK)
data...
Contract
id(PK)
version(PK)
type
Code
tab(PK)
code(PK)
name
У меня есть JPA Entity полиции
@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 =« Тип »и code = type из моего Контракта.
Моя проблема в том, что если у меня есть более одного контракта для моей полиции, я СЛУЧАЙНО? получить org.hibernate.LazyInitializationException.
В моей TestCase, я следующее:
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. В других случаях это работает.
Любые мысли об этом? Почему он не терпит неудачу?
Можете ли вы показать свою сущность «Code»? –
@bigdestroyer: добавил объект кода – griFlo
Я думаю, вам может понадобиться аннотация 'IdClass' на' Code', если вы хотите, чтобы у него был сформированный составной первичный ключ. Вот пример: http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequision#Id_Class –