Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 主休眠会话自动关闭_Java_Spring_Hibernate_Session_Lazy Initialization - Fatal编程技术网

Java 主休眠会话自动关闭

Java 主休眠会话自动关闭,java,spring,hibernate,session,lazy-initialization,Java,Spring,Hibernate,Session,Lazy Initialization,我有一个父实体和子实体,如下所示 @Entity @Table(name = "PARENT") public class Parent implements Comparable<Parent>, Serializable, Cloneable { private static final long serialVersionUID = 1584115734363172986L; public static final int NAME_LENGTH = 300

我有一个父实体和子实体,如下所示

@Entity
@Table(name = "PARENT")
public class Parent implements Comparable<Parent>, Serializable, Cloneable {

    private static final long serialVersionUID = 1584115734363172986L;

    public static final int NAME_LENGTH = 300;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "gen-seq")
    @GenericGenerator(name = "gen-seq", strategy = "native",
        parameters = {@Parameter(name = "sequence_name", value = "parent_id_seq")})
    private Long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    @BatchSize(size = 50)
    @SortNatural
    private SortedSet<Child> child = new TreeSet<>();
}
@实体
@表(name=“PARENT”)
公共类父级实现可比较、可序列化、可克隆{
私有静态最终长serialVersionUID=158415734363172986L;
公共静态最终整数名_长度=300;
@身份证
@GeneratedValue(策略=GenerationType.AUTO,generator=“gen seq”)
@GenericGenerator(name=“gen seq”,strategy=“native”,
参数={@Parameter(name=“sequence\u name”,value=“parent\u id\u seq”)}
私人长id;
@OneToMany(mappedBy=“parent”,cascade=CascadeType.ALL)
@批量大小(大小=50)
@自然的
private SortedSet child=新树集();
}
子实体如下所示

@Entity
@Table(name = "Child")
@Inheritance(strategy= InheritanceType.JOINED)
public class Child implements Comparable<Object>, Serializable, Cloneable, Step<Child> {

    private static final long serialVersionUID = -9091312680432977997L;

    public static final int NAME_LENGTH = 255;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "gen-seq")
    @GenericGenerator(name = "gen-seq", strategy = "native",
        parameters = {@Parameter(name = "sequence_name", value = "child_id_seq")})
    private Long id;

    @ManyToOne()
    @JoinColumn(name = "parentId", nullable = false)
    private Parent parent;
}
@实体
@表(name=“Child”)
@继承(策略=InheritanceType.JOINED)
公共类子级实现可比较的、可序列化的、可克隆的步骤{
私有静态最终长serialVersionUID=-909131268043297997L;
公共静态最终int NAME_LENGTH=255;
@身份证
@GeneratedValue(策略=GenerationType.AUTO,generator=“gen seq”)
@GenericGenerator(name=“gen seq”,strategy=“native”,
参数={@Parameter(name=“sequence\u name”,value=“child\u id\u seq”)})
私人长id;
@ManyToOne()
@JoinColumn(name=“parentId”,nullable=false)
私人家长;
}
我已将Spring和Hibernate配置为处理数据库操作,并在serviceimpl类中添加了以下方法来处理父对象

public void processParent(final Long parentId, String userEmail) throws Exception {
getHibernateTemplate().execute(new HibernateCallback<Set<Void>>() {
    public void doInHibernate(Session session) throws HibernateException    {
        Parent parent = (Parent) session.get(Parent.class, parentId);           
        if (parent!=null && parent.getChild()!=null) {
            for (Child child: parent.getChild()) {

                // here the session is still Open when I call
                child.getParent();

                //But when I call this
                Parent p = getParent(child.getParent().getId());

                //now here the session got closed automatically, and now I cannot process the parent object

                }
            }
        }
    }
}}
public void processParent(最后一个长parentId,字符串userEmail)引发异常{
getHibernateTemplate().execute(新的HibernateCallback()){
public void doInHibernate(会话会话)引发HibernateeException{
Parent Parent=(Parent)session.get(Parent.class,parentId);
if(parent!=null&&parent.getChild()!=null){
for(子:parent.getChild()){
//在这里,当我打电话时,会话仍然打开
getParent();
//但是当我叫它
父p=getParent(child.getParent().getId());
//现在,会话自动关闭,现在我无法处理父对象
}
}
}
}
}}
在上面的方法中,在调用child.getParent()之前,会话一直处于打开状态,但如果我调用下面的方法,该方法本身具有另一个非null的会话,则在返回下面的方法后,上面的方法中的会话将自动变为null

public Parent getParent(final Long id) throws Exception {
Parent actionPoint = (Parent) getHibernateTemplate().execute(new HibernateCallback<Parent>() {

    /* (non-Javadoc)
    * @see org.springframework.orm.hibernate5.HibernateCallback#doInHibernate(org.hibernate.Session)
    */
    public Parent doInHibernate(Session session) throws HibernateException {
        Parent parent = (ActionPoint) session.get(Parent.class, id);

        //here also session is still open
        return parent;
    }
}}
public父getParent(最终长id)引发异常{
父操作点=(父)getHibernateTemplate().execute(新的HibernateCallback()){
/*(非Javadoc)
*@see org.springframework.orm.hibernate5.HibernateCallback#doInHibernate(org.hibernate.Session)
*/
公共父级doInHibernate(会话会话)引发HibernateeException{
Parent Parent=(ActionPoint)session.get(Parent.class,id);
//这里的会议仍然开放
返回父母;
}
}}
有谁能帮我修复主会话不应该关闭或变为空。我知道这是一个配置问题,但我不知道应该配置什么


提前感谢,因为我在过去的两周里一直在努力解决这个问题。

您可以在上述方法中添加
@Transactional
,事务将在方法末尾关闭。要启用
@Transactional
注释,您可以在
上下文持久性.xml
中添加以下代码:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Session Factory -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"/> -->
    <property name="hibernateProperties">
        <map>
            <entry key="hibernate.default_schema" value="${database.default_schema}" />
            <entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}" />
            <entry key="show_sql" value="true" />
            <entry key="hibernate.dialect" value="${hibernate.dialect}" />
            <entry key="transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory" />
        </map>
    </property>
</bean>

您可以在上述方法中添加
@Transactional
,事务将在方法末尾关闭。要启用
@Transactional
注释,您可以在
上下文持久化.xml中添加以下代码:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Session Factory -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"/> -->
    <property name="hibernateProperties">
        <map>
            <entry key="hibernate.default_schema" value="${database.default_schema}" />
            <entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}" />
            <entry key="show_sql" value="true" />
            <entry key="hibernate.dialect" value="${hibernate.dialect}" />
            <entry key="transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory" />
        </map>
    </property>
</bean>


只需介绍Spring TransactionManager,并使用
@Transactional
注释您的服务方法,以避免手动会话/事务处理。如果将“传播”设置为“必需”,则将使用相同的事务。如果使用JTA,请将Hibernate.cfg中的“当前会话上下文类”属性更改为“托管”@PRATHAPS这个问题在某种程度上已经解决了,现在我没有得到任何会话异常,即会话是打开的。但是当我调用其他方法时,
Parent Parent=(Parent)getHibernateTemplate().get(Parent.class,parentId);if(Parent!=null){Hibernate.initialize(Parent.getChildren());}}
我在Hibernate.initialize(parent.getChildren())上没有收到任何会话错误;只需介绍Spring TransactionManager,并使用
@Transactional
注释您的服务方法,以避免手动会话/事务处理。如果将“传播”设置为“必需”,则将使用相同的事务。如果使用JTA-将Hibernate.cfg“当前会话\上下文\类”中的属性更改为“托管”@PRATHAPS这个问题在某种程度上已经解决了,现在我没有得到任何会话异常,即会话是打开的。但是当我调用其他方法时,
Parent Parent=(Parent)getHibernateTemplate().get(Parent.class,parentId);if(Parent!=null){Hibernate.initialize(Parent.getChildren());}}
Hibernate.initialize(parent.getChildren());谢谢你。它帮助我解决了transaction.factory_类的问题。谢谢你。它帮助我解决了transaction.factory_类的问题