2014-10-17 5 views
1

В моем приложении есть 2 объекта - Пользователь и роль. Я хотел бы создать однонаправленную связь ManyToMany.JPA закрывает соединение перед созданием утверждения JoinTable

Мои объекты:

Роль:

@Entity 
@Table(name = "roles") 
public class RoleEntity extends BaseEntity {  
    @Column(nullable = false, unique = true) 
    private String name; 

    //Getters and Setters 
} 

Пользователь:

@Entity 
@Table(name = "users") 
public class UserEntity extends BaseEntity { 
    @Column(nullable = false, unique = true) 
    private String username; 

    @Column(nullable = false, unique = false) 
    private String password; 

    @Column(nullable = false, unique = false) 
    private String firstName; 

    @Column(nullable = false, unique = false) 
    private String lastName; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "user_id")) 
    private Set<RoleEntity> roles = new HashSet<RoleEntity>(); 

    //Getters and Setters 
} 

Проблема возникает при попытке создать нового пользователя, который имеет роль. Я создаю пользователь так:

//Role 
RoleEntity adminRole = new RoleEntity(); 
adminRole.setName("ROLE_ADMIN"); 
roleService.createRole(adminRole); 
//User 
UserEntity admin = new UserEntity("admin", "admin", "adminFirstName", "adminLastName"); 
RoleEntity role_admin = roleService.loadRoleByRoleName("ROLE_ADMIN"); 
admin.getRoles().add(role_admin); 
userService.persistUser(admin); 

Как ни странно, правильные записи базы данных становятся созданы, даже если я получаю исключение, когда JPA пытается записать в присоединяемой таблицу. Стек след:

17-10-2014 11:42:51 DEBUG SQL:104 - insert into users (firstName, lastName, password, username) values (?, ?, ?, ?) 
17-10-2014 11:42:51 DEBUG IdentifierGeneratorHelper:93 - Natively generated identity: 1 
17-10-2014 11:42:51 DEBUG AbstractTransactionImpl:173 - committing 
17-10-2014 11:42:51 DEBUG AbstractFlushingEventListener:147 - Processing flush-time cascades 
17-10-2014 11:42:51 DEBUG AbstractFlushingEventListener:188 - Dirty checking collections 
17-10-2014 11:42:51 DEBUG Collections:190 - Collection found: [de.mato.main.entities.UserEntity.roles#1], was: [<unreferenced>] (initialized) 
17-10-2014 11:42:51 DEBUG AbstractFlushingEventListener:121 - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects 
17-10-2014 11:42:51 DEBUG AbstractFlushingEventListener:128 - Flushed: 1 (re)creations, 0 updates, 0 removals to 1 collections 
17-10-2014 11:42:51 DEBUG EntityPrinter:114 - Listing entities: 
17-10-2014 11:42:51 DEBUG EntityPrinter:121 - de.mato.main.entities.UserEntity{id=1, lastName=adminLastName, username=admin, roles=[de.mato.main.entities.RoleEntity#1], firstName=adminFirstName, password=$2a$10$OHRpnWfnHqIdsPUB2WGV1OUVdaVZ8tdSNsJ3DcaRK4cy3xOp1UMs6} 
17-10-2014 11:42:51 DEBUG AbstractCollectionPersister:1201 - Inserting collection: [de.mato.main.entities.UserEntity.roles#1] 
17-10-2014 11:42:51 DEBUG SQL:104 - insert into users_roles (role_id, user_id) values (?, ?) 
17-10-2014 11:42:51 DEBUG SqlExceptionHelper:294 - could not log warnings 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:408) 
    at com.mysql.jdbc.Util.getInstance(Util.java:383) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1023) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928) 
    at com.mysql.jdbc.StatementImpl.checkClosed(StatementImpl.java:466) 
    at com.mysql.jdbc.StatementImpl.getWarnings(StatementImpl.java:2463) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:291) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:250) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:489) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.release(JdbcCoordinatorImpl.java:381) 
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.releaseStatements(AbstractBatchImpl.java:171) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:73) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1256) 
    at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:395) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:387) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:309) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:349) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1159) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:496) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy65.persistUser(Unknown Source) 
    at de.mato.main.ApplicationInit.createStandardRoles(ApplicationInit.java:60) 
    at de.mato.main.ApplicationInit.onApplicationEvent(ApplicationInit.java:43) 
    at de.mato.main.ApplicationInit.onApplicationEvent(ApplicationInit.java:1) 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151) 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128) 
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331) 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:773) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
17-10-2014 11:42:51 DEBUG SqlExceptionHelper:302 - could not clear warnings 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:408) 
    at com.mysql.jdbc.Util.getInstance(Util.java:383) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1023) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928) 
    at com.mysql.jdbc.StatementImpl.checkClosed(StatementImpl.java:466) 
    at com.mysql.jdbc.StatementImpl.clearWarnings(StatementImpl.java:558) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings(SqlExceptionHelper.java:300) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings(SqlExceptionHelper.java:250) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:489) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.release(JdbcCoordinatorImpl.java:381) 
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.releaseStatements(AbstractBatchImpl.java:171) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:73) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1256) 
    at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:395) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:387) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:309) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:349) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1159) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:496) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy65.persistUser(Unknown Source) 
    at de.mato.main.ApplicationInit.createStandardRoles(ApplicationInit.java:60) 
    at de.mato.main.ApplicationInit.onApplicationEvent(ApplicationInit.java:43) 
    at de.mato.main.ApplicationInit.onApplicationEvent(ApplicationInit.java:1) 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151) 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128) 
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331) 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:773) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
17-10-2014 11:42:51 DEBUG JdbcCoordinatorImpl:512 - Exception clearing maxRows/queryTimeout [No operations allowed after statement closed.] 
17-10-2014 11:42:51 DEBUG AbstractCollectionPersister:1284 - Done inserting collection: 1 rows inserted 

Я уже пытался создать пул подключений, но я получаю подобные исключения. Есть ли у кого-нибудь идеи, что мне не хватает?

Спасибо

+2

Возможно, вам требуется выполнить транзакцию для выполнения нескольких вставок (это означает, что я думаю, что это исключение) – JBA

+1

Попробуйте сделать все вместе внутри аннотированного метода @ @ Transactional в экземпляре службы. (пример в 'userService.createUserAndRole (...)' – jmvivo

+0

Вводя все это в один метод и аннотируя его как @Transactional, не работает/бросает одно и то же исключение. – Henry

ответ

1

Ищет проблему. Пробуется другая версия Hibernate (ниже 4.0.2). Кто-нибудь знает почему?

+0

Да, это сработало и для меня. версия 4.2.18.Final затем опустила его 4.0.1.Final и работала нормально. Но я не знаю, чтобы объяснить, почему. В любом случае спасибо за обмен. –

Смежные вопросы