Spring MVC + Hibernate:从逆(非所有者)方面保存多对多关系

时间:2014-01-06 03:59:37

标签: java hibernate spring-mvc

我已经阅读了我在SO上发现的所有可能与我的问题有关的内容并且没有找到解决方案(我是Spring MVC和Hibernate的初学者)。 我在实体学生和活动之间有多对多关联,学生作为所有者方。当我尝试保存新活动时,活动将保存在活动表中,但不会在StudentActivity表中保存任何更改。

这些是学生和活动实体:

@Entity
@Table(name = "student")
public class Student implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "STUDENT_ID", unique = true, nullable = false)
    private Integer studentId;

    @Column(name = "FIRST_NAME", nullable = false, length = 50)
    private String firstName;

    @Column(name = "LAST_NAME", nullable = false, length = 50)
    private String lastName;

    @Column(name = "ROLL_NUMBER", nullable = false, length = 3)
    private String rollNumber;

    @Column(name = "ROLL_YEAR", nullable = false, length = 4)
    private String rollYear;

    @Column(name = "INDEX_NUMBER", unique = true, nullable = false, length = 20)
    private String indexNumber;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
    @JoinColumn(name = "PROGRAM_FK", nullable = false)
    private Program program;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
    @JoinTable(name="student_activity",
                joinColumns = @JoinColumn(name = "STUDENT_FK"),
                inverseJoinColumns = @JoinColumn(name = "ACTIVITY_FK"))
    @ForeignKey(name = "FK_STUDENT_ACTIVITY_STUDENT", 
                inverseName = "FK_STUDENT_ACTIVITY_ACTIVITY")
    private Set<Activity> activities = new HashSet<Activity>();


@Entity
@Table(name = "activity")
public class Activity implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "ACTIVITY_ID", unique = true, nullable = false)
    private Integer activityId;

    @Column(name = "ESSAY_FLAG", nullable = false)
    private String essayFlag;

    @Column(name = "ACTIVITY_DESCRIPTION", nullable = false, length = 255)
    private String activityDescription;

    @Column(name = "SUBMISSION_DATE", nullable = false)
    private String submissionDate;

    @Column(name = "SCORE", nullable = false)
    private Integer score;

    @Column(name = "NOTE")
    private String note;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
    @JoinColumn(name = "COURSE_FK", nullable = false)
    private Course course;

    @ManyToMany(cascade = {CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinTable(name="activity_teacher",
                joinColumns = @JoinColumn(name = "ACTIVITY_FK"),
                inverseJoinColumns = @JoinColumn(name = "TEACHER_FK"))
    @ForeignKey(name = "FK_ACTIVITY_TEACHER_ACTIVITY", 
                inverseName = "FK_ACTIVITY_TEACHER_TEACHER")
    private Set<Teacher> teachers;

    @ManyToMany(mappedBy="activities")
    private Set<Student> students = new HashSet<Student>();

这是来自处理保存的服务层的方法:

public void add(Integer studentId, Activity activity) {

        logger.debug("Adding new activity");

        // Retrieve session from Hibernate
        Session session = sessionFactory.getCurrentSession();

        // Retrieve existing student via id
        Student existingStudent = (Student) session.get(Student.class, studentId);

        // Add student to activity
        activity.getStudents().add(existingStudent);

        // Persist to db
        session.save(activity);
    }

这是Hibernate记录的内容:

[DEBUG] [http-bio-8080-exec-9 04:07:41] (ActivityService.java:add:42) Adding new activity
[TRACE] [http-bio-8080-exec-9 04:07:41] (TransactionSynchronizationManager.java:getResource:140) Retrieved value [org.springframework.orm.hibernate4.SessionHolder@1fcdd1af] for key [org.hibernate.internal.SessionFactoryImpl@47c105ec] bound to thread [http-bio-8080-exec-9]
[TRACE] [http-bio-8080-exec-9 04:07:41] (TransactionSynchronizationManager.java:getResource:140) Retrieved value [org.springframework.orm.hibernate4.SessionHolder@1fcdd1af] for key [org.hibernate.internal.SessionFactoryImpl@47c105ec] bound to thread [http-bio-8080-exec-9]
[DEBUG] [http-bio-8080-exec-9 04:07:41] (SqlStatementLogger.java:logStatement:104) 
    /* load org.jana.domain.Student */ select
        student0_.STUDENT_ID as STUDENT_1_4_4_,
        student0_.FIRST_NAME as FIRST_NA2_4_4_,
        student0_.INDEX_NUMBER as INDEX_NU3_4_4_,
        student0_.LAST_NAME as LAST_NAM4_4_4_,
        student0_.PROGRAM_FK as PROGRAM_7_4_4_,
        student0_.ROLL_NUMBER as ROLL_NUM5_4_4_,
        student0_.ROLL_YEAR as ROLL_YEA6_4_4_,
        activities1_.STUDENT_FK as STUDENT_1_4_6_,
        activity2_.ACTIVITY_ID as ACTIVITY2_5_6_,
        activity2_.ACTIVITY_ID as ACTIVITY1_0_0_,
        activity2_.ACTIVITY_DESCRIPTION as ACTIVITY2_0_0_,
        activity2_.COURSE_FK as COURSE_F7_0_0_,
        activity2_.ESSAY_FLAG as ESSAY_FL3_0_0_,
        activity2_.NOTE as NOTE4_0_0_,
        activity2_.SCORE as SCORE5_0_0_,
        activity2_.SUBMISSION_DATE as SUBMISSI6_0_0_,
        course3_.COURSE_ID as COURSE_I1_2_1_,
        course3_.COURSE_DESCRITPION as COURSE_D2_2_1_,
        course3_.ESPB as ESPB3_2_1_,
        teachers4_.ACTIVITY_FK as ACTIVITY1_0_7_,
        teacher5_.TEACHER_ID as TEACHER_2_1_7_,
        teacher5_.TEACHER_ID as TEACHER_1_6_2_,
        teacher5_.FIRST_NAME as FIRST_NA2_6_2_,
        teacher5_.LAST_NAME as LAST_NAM3_6_2_,
        teacher5_.TITLE_FK as TITLE_FK4_6_2_,
        program6_.PROGRAM_ID as PROGRAM_1_3_3_,
        program6_.PROGRAM_DESCRIPTION as PROGRAM_2_3_3_ 
    from
        student student0_ 
    left outer join
        student_activity activities1_ 
            on student0_.STUDENT_ID=activities1_.STUDENT_FK 
    left outer join
        activity activity2_ 
            on activities1_.ACTIVITY_FK=activity2_.ACTIVITY_ID 
    left outer join
        course course3_ 
            on activity2_.COURSE_FK=course3_.COURSE_ID 
    left outer join
        activity_teacher teachers4_ 
            on activity2_.ACTIVITY_ID=teachers4_.ACTIVITY_FK 
    left outer join
        teacher teacher5_ 
            on teachers4_.TEACHER_FK=teacher5_.TEACHER_ID 
    inner join
        program program6_ 
            on student0_.PROGRAM_FK=program6_.PROGRAM_ID 
    where
        student0_.STUDENT_ID=?
Hibernate: 
    /* load org.jana.domain.Student */ select
        student0_.STUDENT_ID as STUDENT_1_4_4_,
        student0_.FIRST_NAME as FIRST_NA2_4_4_,
        student0_.INDEX_NUMBER as INDEX_NU3_4_4_,
        student0_.LAST_NAME as LAST_NAM4_4_4_,
        student0_.PROGRAM_FK as PROGRAM_7_4_4_,
        student0_.ROLL_NUMBER as ROLL_NUM5_4_4_,
        student0_.ROLL_YEAR as ROLL_YEA6_4_4_,
        activities1_.STUDENT_FK as STUDENT_1_4_6_,
        activity2_.ACTIVITY_ID as ACTIVITY2_5_6_,
        activity2_.ACTIVITY_ID as ACTIVITY1_0_0_,
        activity2_.ACTIVITY_DESCRIPTION as ACTIVITY2_0_0_,
        activity2_.COURSE_FK as COURSE_F7_0_0_,
        activity2_.ESSAY_FLAG as ESSAY_FL3_0_0_,
        activity2_.NOTE as NOTE4_0_0_,
        activity2_.SCORE as SCORE5_0_0_,
        activity2_.SUBMISSION_DATE as SUBMISSI6_0_0_,
        course3_.COURSE_ID as COURSE_I1_2_1_,
        course3_.COURSE_DESCRITPION as COURSE_D2_2_1_,
        course3_.ESPB as ESPB3_2_1_,
        teachers4_.ACTIVITY_FK as ACTIVITY1_0_7_,
        teacher5_.TEACHER_ID as TEACHER_2_1_7_,
        teacher5_.TEACHER_ID as TEACHER_1_6_2_,
        teacher5_.FIRST_NAME as FIRST_NA2_6_2_,
        teacher5_.LAST_NAME as LAST_NAM3_6_2_,
        teacher5_.TITLE_FK as TITLE_FK4_6_2_,
        program6_.PROGRAM_ID as PROGRAM_1_3_3_,
        program6_.PROGRAM_DESCRIPTION as PROGRAM_2_3_3_ 
    from
        student student0_ 
    left outer join
        student_activity activities1_ 
            on student0_.STUDENT_ID=activities1_.STUDENT_FK 
    left outer join
        activity activity2_ 
            on activities1_.ACTIVITY_FK=activity2_.ACTIVITY_ID 
    left outer join
        course course3_ 
            on activity2_.COURSE_FK=course3_.COURSE_ID 
    left outer join
        activity_teacher teachers4_ 
            on activity2_.ACTIVITY_ID=teachers4_.ACTIVITY_FK 
    left outer join
        teacher teacher5_ 
            on teachers4_.TEACHER_FK=teacher5_.TEACHER_ID 
    inner join
        program program6_ 
            on student0_.PROGRAM_FK=program6_.PROGRAM_ID 
    where
        student0_.STUDENT_ID=?
[TRACE] [http-bio-8080-exec-9 04:07:41] (BasicBinder.java:bind:84) binding parameter [1] as [INTEGER] - 1
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:68) Found [null] as column [ACTIVITY1_0_0_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:68) Found [null] as column [COURSE_I1_2_1_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:68) Found [null] as column [TEACHER_1_6_2_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [A2] as column [PROGRAM_1_3_3_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [Some study program] as column [PROGRAM_2_3_3_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [Jana] as column [FIRST_NA2_4_4_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [A2 10/10] as column [INDEX_NU3_4_4_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [Janis] as column [LAST_NAM4_4_4_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [A2] as column [PROGRAM_7_4_4_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [10] as column [ROLL_NUM5_4_4_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [2010] as column [ROLL_YEA6_4_4_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:68) Found [null] as column [STUDENT_1_4_6_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:68) Found [null] as column [ACTIVITY1_0_7_]
[DEBUG] [http-bio-8080-exec-9 04:07:42] (SqlStatementLogger.java:logStatement:104) 
    /* get current state org.jana.domain.Course */ select
        course_.COURSE_ID,
        course_.COURSE_DESCRITPION as COURSE_D2_2_,
        course_.ESPB as ESPB3_2_ 
    from
        course course_ 
    where
        course_.COURSE_ID=?
Hibernate: 
    /* get current state org.jana.domain.Course */ select
        course_.COURSE_ID,
        course_.COURSE_DESCRITPION as COURSE_D2_2_,
        course_.ESPB as ESPB3_2_ 
    from
        course course_ 
    where
        course_.COURSE_ID=?
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [1] as [VARCHAR] - OAS123
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [Internet marketing] as column [COURSE_D2_2_]
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicExtractor.java:extract:74) Found [5] as column [ESPB3_2_]
[DEBUG] [http-bio-8080-exec-9 04:07:42] (SqlStatementLogger.java:logStatement:104) 
    /* insert org.jana.domain.Activity
        */ insert 
        into
            activity
            (ACTIVITY_DESCRIPTION, COURSE_FK, ESSAY_FLAG, NOTE, SCORE, SUBMISSION_DATE) 
        values
            (?, ?, ?, ?, ?, ?)
Hibernate: 
    /* insert org.jana.domain.Activity
        */ insert 
        into
            activity
            (ACTIVITY_DESCRIPTION, COURSE_FK, ESSAY_FLAG, NOTE, SCORE, SUBMISSION_DATE) 
        values
            (?, ?, ?, ?, ?, ?)
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [1] as [VARCHAR] - Blah blah
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [2] as [VARCHAR] - OAS123
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [3] as [VARCHAR] - Essay
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [4] as [VARCHAR] - 
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [5] as [INTEGER] - 30
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [6] as [VARCHAR] - 28.01.2014
[TRACE] [http-bio-8080-exec-9 04:07:42] (TransactionAspectSupport.java:commitTransactionAfterReturning:473) Completing transaction for [org.jana.service.ActivityService.add]
[TRACE] [http-bio-8080-exec-9 04:07:42] (TransactionAspectSupport.java:commitTransactionAfterReturning:473) Completing transaction for [org.jana.service.ActivityService.add]
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerBeforeCommit:923) Triggering beforeCommit synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerBeforeCommit:923) Triggering beforeCommit synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerBeforeCompletion:936) Triggering beforeCompletion synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerBeforeCompletion:936) Triggering beforeCompletion synchronization
[DEBUG] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:processCommit:753) Initiating transaction commit
[DEBUG] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:processCommit:753) Initiating transaction commit
[DEBUG] [http-bio-8080-exec-9 04:07:42] (HibernateTransactionManager.java:doCommit:550) Committing Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[EntityKey[org.jana.domain.Activity#33], EntityKey[org.jana.domain.Student#1], EntityKey[org.jana.domain.Program#A2], EntityKey[org.jana.domain.Teacher#5]],collectionKeys=[CollectionKey[org.jana.domain.Student.activities#1], CollectionKey[org.jana.domain.Teacher.activities#5]]];ActionQueue[insertions=[] updates=[] deletions=[] orphanRemovals=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] collectionQueuedOps=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])]
[DEBUG] [http-bio-8080-exec-9 04:07:42] (HibernateTransactionManager.java:doCommit:550) Committing Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[EntityKey[org.jana.domain.Activity#33], EntityKey[org.jana.domain.Student#1], EntityKey[org.jana.domain.Program#A2], EntityKey[org.jana.domain.Teacher#5]],collectionKeys=[CollectionKey[org.jana.domain.Student.activities#1], CollectionKey[org.jana.domain.Teacher.activities#5]]];ActionQueue[insertions=[] updates=[] deletions=[] orphanRemovals=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] collectionQueuedOps=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])]
[DEBUG] [http-bio-8080-exec-9 04:07:42] (SqlStatementLogger.java:logStatement:104) 
    /* update
        org.jana.domain.Teacher */ update
            teacher 
        set
            FIRST_NAME=?,
            LAST_NAME=?,
            TITLE_FK=? 
        where
            TEACHER_ID=?
Hibernate: 
    /* update
        org.jana.domain.Teacher */ update
            teacher 
        set
            FIRST_NAME=?,
            LAST_NAME=?,
            TITLE_FK=? 
        where
            TEACHER_ID=?
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [1] as [VARCHAR] - Pery
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [2] as [VARCHAR] - White
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [3] as [INTEGER] - 4
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [4] as [INTEGER] - 5
[DEBUG] [http-bio-8080-exec-9 04:07:42] (SqlStatementLogger.java:logStatement:104) 
    /* insert collection
        row org.jana.domain.Activity.teachers */ insert 
        into
            activity_teacher
            (ACTIVITY_FK, TEACHER_FK) 
        values
            (?, ?)
Hibernate: 
    /* insert collection
        row org.jana.domain.Activity.teachers */ insert 
        into
            activity_teacher
            (ACTIVITY_FK, TEACHER_FK) 
        values
            (?, ?)
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [1] as [INTEGER] - 33
[TRACE] [http-bio-8080-exec-9 04:07:42] (BasicBinder.java:bind:84) binding parameter [2] as [INTEGER] - 5
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerAfterCommit:949) Triggering afterCommit synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerAfterCommit:949) Triggering afterCommit synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerAfterCompletion:965) Triggering afterCompletion synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (AbstractPlatformTransactionManager.java:triggerAfterCompletion:965) Triggering afterCompletion synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (TransactionSynchronizationManager.java:clearSynchronization:331) Clearing transaction synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (TransactionSynchronizationManager.java:clearSynchronization:331) Clearing transaction synchronization
[TRACE] [http-bio-8080-exec-9 04:07:42] (TransactionSynchronizationManager.java:doUnbindResource:243) Removed value [org.springframework.orm.hibernate4.SessionHolder@1fcdd1af] for key [org.hibernate.internal.SessionFactoryImpl@47c105ec] from thread [http-bio-8080-exec-9]
[TRACE] [http-bio-8080-exec-9 04:07:42] (TransactionSynchronizationManager.java:doUnbindResource:243) Removed value [org.springframework.orm.hibernate4.SessionHolder@1fcdd1af] for key [org.hibernate.internal.SessionFactoryImpl@47c105ec] from thread [http-bio-8080-exec-9]
[TRACE] [http-bio-8080-exec-9 04:07:43] (TransactionSynchronizationManager.java:doUnbindResource:243) Removed value [org.springframework.jdbc.datasource.ConnectionHolder@54aadf5f] for key [com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1g5z4wg8zs5ylz61mbp71x|3ae24197, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1g5z4wg8zs5ylz61mbp71x|3ae24197, idleConnectionTestPeriod -> 60, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/essaysdb?useUnicode=true&characterEncoding=UTF-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]] from thread [http-bio-8080-exec-9]
[TRACE] [http-bio-8080-exec-9 04:07:43] (TransactionSynchronizationManager.java:doUnbindResource:243) Removed value [org.springframework.jdbc.datasource.ConnectionHolder@54aadf5f] for key [com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1g5z4wg8zs5ylz61mbp71x|3ae24197, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1g5z4wg8zs5ylz61mbp71x|3ae24197, idleConnectionTestPeriod -> 60, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/essaysdb?useUnicode=true&characterEncoding=UTF-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]] from thread [http-bio-8080-exec-9]
[DEBUG] [http-bio-8080-exec-9 04:07:43] (HibernateTransactionManager.java:doCleanupAfterCompletion:632) Closing Hibernate Session
...

我错过了什么?

更新和解决方案

我必须更新多对多关系的两个方面,如下所示:

public void add(Integer studentId, Activity activity) {

        logger.debug("Adding new activity");

        // Retrieve session from Hibernate
        Session session = sessionFactory.getCurrentSession();

        // Retrieve existing student via id
        Student existingStudent = (Student) session.get(Student.class, studentId);

        // Add activity to student - THIS IS NEW !!!
        existingStudent.getActivities().add(activity);

        // Add student to activity
        activity.getStudents().add(existingStudent);

        // Persist to db
        session.save(activity);
    }

This回答有帮助!我以前错过了它:/

0 个答案:

没有答案