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)
当我调试这个时,我的实体类中定义的每个集合都出错了 -  com.sun.jdi.InvocationException occurred invoking method.
我尝试使用collection.size()和Hibernate.initialize(),但没有一个工作.在网上搜索我发现延长Persitence将解决问题,即.
 @PersistenceContext(type=PersistenceContextType.EXTENDED)
        protected EntityManager em;
这工作得很好,但通过这个我发现他们将永远保持打开,现在春天不会处理这个.有没有办法用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") …我正在尝试使用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)
.....
这是我的网页控制器的代码;
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;
}
使用此显示html在网页上使用哪个;
<table border="1">
    <c:forEach items="${model.reports}" var="report">
        <tr>
            <td><c:out …我在查看页面时收到这些错误日志
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>
在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>
Java类:
public class A {
   private long id;
   private B entityB;
   // getters and setters skipped
}
是否可以更改Hibernate映射,以便Hibernate在启动时仍然强制执行和创建外键,但类A看起来如下所示:
public class A {
   private long id;
   private long idOfB;
   // getters and setters skipped
}
我明白,如果我转换<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
}
@Entity
@Table(name …