Transaction-scoped Persistence上下文和Extended Persistence上下文之间有什么区别?
我在Spring(3.2.2)中使用JPA(使用Hibernate 4.3.3作为持久性提供程序),我的所有字段都正常加载,但是当我尝试访问我的Collection时,它会抛出错误 -
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.br.common.catalog.entity.Category.allParentCategoryXrefs, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:572)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:212)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:551)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:140)
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:526)
at java.lang.String.valueOf(String.java:2827)
at java.io.PrintStream.println(PrintStream.java:771)
at test.Test.main(Test.java:30)
Run Code Online (Sandbox Code Playgroud)
当我调试这个时,我的实体类中定义的每个集合都出错了 - com.sun.jdi.InvocationException occurred invoking method.
我尝试使用collection.size()和Hibernate.initialize(),但没有一个工作.在网上搜索我发现延长Persitence将解决问题,即.
@PersistenceContext(type=PersistenceContextType.EXTENDED)
protected EntityManager em;
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但通过这个我发现他们将永远保持打开,现在春天不会处理这个.有没有办法用Spring解决这个问题.任何帮助都非常感谢.
我的实体是 -
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name="CATEGORY")
public class Category implements Serializable {
@Id
@GeneratedValue(generator= "CategoryId")
@Column(name = "CATEGORY_ID")
protected Long id;
@ManyToOne(targetEntity = Category.class)
@JoinColumn(name = "DEFAULT_PARENT_CATEGORY_ID") …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Spring MVC创建一个Web应用程序,将Hibernate作为其ORM层.但是,由于我对这两个框架缺乏经验,我正在努力.
以下代码将正确显示我正在查找的所有记录,但仍将堆栈跟踪放入我的日志中.我无法找到有关集成Hibernate和SpringMVC的详细文档(我查看了springsource.org并阅读了关于interweb的各种文章).谁能指出我在这里做错了什么?
请注意,我花了一些时间试图在互联网上找到答案,包括查看这个问题.遗憾的是没有帮助.
我还应该注意,此应用程序的ORM部分已在独立的Java应用程序中使用和测试,没有任何问题.所以我认为Spring MVC和Hibernate的集成导致了这个问题.
这是具有着名的延迟初始化问题的堆栈跟踪(截断);
2009-03-10 12:14:50,353 [http-8084-6] ERROR org.hibernate.LazyInitializationException.<init>(LazyInitializationException.java:19) - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at com.generic.orm.generated.SearchRule$$EnhancerByCGLIB$$92abaed6.toString(<generated>)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuffer.append(StringBuffer.java:219)
at org.apache.commons.lang.builder.ToStringStyle.appendDetail(ToStringStyle.java:578)
at org.apache.commons.lang.builder.ToStringStyle.appendInternal(ToStringStyle.java:542)
at org.apache.commons.lang.builder.ToStringStyle.append(ToStringStyle.java:428)
at org.apache.commons.lang.builder.ToStringBuilder.append(ToStringBuilder.java:840)
at org.apache.commons.lang.builder.ReflectionToStringBuilder.appendFieldsIn(ReflectionToStringBuilder.java:606)
.....
Run Code Online (Sandbox Code Playgroud)
这是我的网页控制器的代码;
private List<Report> getReports() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<Report> reports = session.createCriteria(Report.class).list();
Hibernate.initialize(reports);
session.getTransaction().commit();
return reports;
}
Run Code Online (Sandbox Code Playgroud)
使用此显示html在网页上使用哪个;
<table border="1">
<c:forEach items="${model.reports}" var="report">
<tr>
<td><c:out …Run Code Online (Sandbox Code Playgroud) 我在查看页面时收到这些错误日志
ERROR [TP-Processor11] (LazyInitializationException.java:42) - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at org.osmoz.contents.model.enm.ContentType_$$_javassist_71.getDefaultShortMode(ContentType_$$_javassist_71.java)
at org.osmoz.contents.web.tapestry.components.EnmContentZone.getTemplate(EnmContentZone.java:67)
at org.osmoz.contents.web.tapestry.base.AbstractRawContentZone.getContent(AbstractRawContentZone.java:67)
at $PropertyConduit_1276091af82.get($PropertyConduit_1276091af82.java)
at org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:58)
at org.apache.tapestry5.internal.structure.InternalComponentResourcesImpl$1.read(InternalComponentResourcesImpl.java:510)
at org.apache.tapestry5.internal.structure.InternalComponentResourcesImpl$1.read(InternalComponentResourcesImpl.java:496)
at org.apache.tapestry5.corelib.components.OutputRaw._$read_parameter_value(OutputRaw.java)
at org.apache.tapestry5.corelib.components.OutputRaw.beginRender(OutputRaw.java:43)
at org.apache.tapestry5.corelib.components.OutputRaw.beginRender(OutputRaw.java)
at
我知道问题是Session已经关闭了.但我真的不知道为什么这个错误不会经常发生,为什么我不知道根本原因.
环境:
Tapestry5,JPA,Hibernate 3.3.2.GA
我已经定了
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
Run Code Online (Sandbox Code Playgroud)
在web.xml中也是
假设提供了以下映射:
<class name="A" table="a_table">
<id name="id"/>
<many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/>
</class>
<class name="B" table="b_table">
<id name="id"/>
</class>
Run Code Online (Sandbox Code Playgroud)
Java类:
public class A {
private long id;
private B entityB;
// getters and setters skipped
}
Run Code Online (Sandbox Code Playgroud)
是否可以更改Hibernate映射,以便Hibernate在启动时仍然强制执行和创建外键,但类A看起来如下所示:
public class A {
private long id;
private long idOfB;
// getters and setters skipped
}
Run Code Online (Sandbox Code Playgroud)
我明白,如果我转换<many-to-one...成一个<property...可以工作,但数据库不会强制执行外键.
我需要这样做,因为对象B可能(或可能不)单独初始化,这有时会导致
org.hibernate.LazyInitializationException: could not initialize proxy - no Session在a.getB()调用时发生异常.我宁愿把它作为一个long idOfB并在必要时加载整个对象; 这也可以A …
自学Hibernate,我有以下表结构/关系

这由以下类别代表......
@Entity
@Table(name = "users")
public class User implements IUser<Role>, Serializable {
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
@SequenceGenerator(name = "user_key_seq")
@Column(name = "key", insertable = false, updatable = false)
private Long key;
@Column(name = "name")
private String name;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "userroles",
joinColumns = {
@JoinColumn(name = "userkey")},
inverseJoinColumns = {
@JoinColumn(name = "rolekey")})
private Set<Role> roles = new HashSet<>(5);
@Override
public Set<Role> getRoles() {
return roles;
}
// Other setters and getters
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(name …Run Code Online (Sandbox Code Playgroud)