我正在开始一个新项目,我对JPA/Hibernate的使用完全不熟悉.我正在尝试了解如何正确使用EntityManager.更准确地说,何时实例化它们,我需要多少,如果我关闭它们,我应该把所有东西都放到交易中吗?
无论如何,在我当前的代码中,我在尝试读取之前保存的实体时遇到了org.hibernate.LazyInitializationException.我会理解相反的事情(在事务中读取一个antity然后尝试在另一个事务中保存读取实体但是由于事务已经结束,实体是非托管的,因此保存失败),但这是我无法理解的.
我把我的代码放在GitHub上(https://github.com/GaetanLeu/intl),它只是几个类.我的主要是在src/sandbox/MessageSandbox.java中,它在第28行失败,带有以下stacktrace:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at entity.MessageKey_$$_jvstfcc_0.toString(MessageKey_$$_jvstfcc_0.java)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at com.google.common.base.Present.toString(Present.java:88)
at java.lang.String.valueOf(String.java:2854)
at java.io.PrintStream.println(PrintStream.java:821)
at sandbox.MessageSandbox.main(MessageSandbox.java:28)
Run Code Online (Sandbox Code Playgroud)
另外我收到来自Hibernate的警告说我的EntityManager已经存在,那么会发生什么?EntityManagerFactory.createEntityManager方法是否返回现有的方法?
WARN: HHH000436: Entity manager factory name (intl) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'
Run Code Online (Sandbox Code Playgroud)
真的,我迷失了什么时候创建EntityManagers ^^任何帮助将不胜感激,但请简单的解释我真的很新.
哦顺便说一下,我想确切地说我没有使用Spring,我没有EJB,我想现在手动操作EntityManagers直到我理解它为止.谢谢 :)