如何在hibernate/spring中更新多对多集合(延迟加载)?

如何在hibernate/spring中更新多对多集合(延迟加载)?,spring,hibernate,orm,hibernate-mapping,Spring,Hibernate,Orm,Hibernate Mapping,我有三个表和两个类。这两个表/类之间存在多对多关系。 OYS_用户->使用“OYS_课程”的多对多 OYS_课程->使用“OYS_用户”的多对多 OYS_课程_学生->关系 在User.class中 将当前用户添加到课程集合或将课程添加到当前用户集合时。 更新/插入查询未出现在hibernate统计控制台日志中。 因此,不能将记录添加到任何集合中。 基本上,我想向多对多集合添加新对象。我做错了什么 我使用Hibernate4.3.5.Final来消除延迟加载异常 我使用org.springfra

我有三个表和两个类。这两个表/类之间存在多对多关系。 OYS_用户->使用“OYS_课程”的多对多 OYS_课程->使用“OYS_用户”的多对多 OYS_课程_学生->关系 在User.class中

将当前用户添加到课程集合或将课程添加到当前用户集合时。 更新/插入查询未出现在hibernate统计控制台日志中。 因此,不能将记录添加到任何集合中。 基本上,我想向多对多集合添加新对象。我做错了什么

我使用Hibernate4.3.5.Final来消除延迟加载异常 我使用org.springframework.orm.hibernate4.support.OpenSessionInViewFilter来消除延迟加载异常。 我尝试了CascadeType.EAGER和FetchType.JOIN。但没有更改结果。更新/插入查询不会出现在hibernate统计控制台日志中。 我在application-context.xmlspring-hibernate-configuration中为hibernate使用以下属性:

    <property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.generate_statistics">true</prop>
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
        </prop>
        <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
        <prop key="use_sql_comments">true</prop>
        <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
        <prop key="hibernate.connection.autocommit">true</prop>
        <prop key="net.sf.ehcache.configurationResourceName">/myehcache.xml</prop>
    </props>
</property>
和spring txManager:

        <!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager" />

<!-- Transaction Manager is defined -->
<bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>
我使用spring/security、Hibernate4.3.5.Final、jpa2.1和jsf2.2。提前谢谢

你就快到了

首先,你需要决定你关系中的哪个网站处于“控制之中”。是用户还是课程。并且仅在其中一个上定义联接表,例如: -用户保持原样 -你换了什么课

@ManyToMany(mappedBy="studentLessons" ...)
然后,您需要手动将关系添加到关系的两个站点。实际上,添加到负责映射的站点通常是不够的

所以


如果两者都是在事务内部发布的,则会导致插入

这个jsf是如何相关的?不,您没有使用JPA API。您确切的意思是什么?我使用JPA 2.1用于hibernate 4.3.5.Final。您有什么建议来解决这个问题吗?谢谢@Neil Stockton您使用的是hibernate的API,而不是JPA API。JPA中没有会话。JPA没有任何限制。我应该怎么做?谢谢你的回复。我试过上面的代码。但没有改变。当我编码log.infouser.getStudentLessons.toString,我看到了所有info user表列、oys_user_课程表info以及此结果的select查询。我看到了getStudentLessons列表大小的增加。到目前为止,一切正常。但随后不执行更新过程。我没有看到控制台中的更新/插入查询。因此,我没有看到oys_学生_课程表中的记录。:/you insed transaction?我自己没有使用hibernate和spring,只有jpa,对于非托管事务,代码将是EM.getTransaction.begin;User=EM.find。添加课程;。。。EM.getTransaction.commit;在Spring中,它是通过围绕方法的@Transactional注释或类似的东西来完成的,很抱歉不是Spring用户。与您尝试插入持久化新用户或课程的方式相同。我在服务类/层中使用@Transactional annotation。我使用autocommit。您可以在hibernate属性中看到。通常用户可以更新/I可以更新。但当我将课程对象添加到用户的课程集合中时,不是更新。它必须工作,代码看起来正常,如果您修复了mappedby,那么映射是可以的,这就是在JPA中如何完成的。因此,嫌疑犯就是您的事务/会话。尝试修改addLessonToStudent方法中user/lesson的属性,并检查该方法退出后是否发出sql更新。我想不会有更新。在updateUseruser;之前,我手动选中了“更改为用户名”等选项;。仅更新useruser table.hibernate,就像studentLessons集合未更改一样。
    <property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.generate_statistics">true</prop>
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
        </prop>
        <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
        <prop key="use_sql_comments">true</prop>
        <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
        <prop key="hibernate.connection.autocommit">true</prop>
        <prop key="net.sf.ehcache.configurationResourceName">/myehcache.xml</prop>
    </props>
</property>
        <!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager" />

<!-- Transaction Manager is defined -->
<bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>
@ManyToMany(mappedBy="studentLessons" ...)
user.getUserLesseson().add(lesson);
lesson.getLessonStudents().add(user);