2014-04-07 113 views
0

在我的春天應用程序,我想在數據庫中持久後續實體:org.hibernate.PersistentObjectException:獨立實體被persist:com.horariolivre.entity.Key

@Entity 
@Table(name = "usuario") 
public class Usuario implements java.io.Serializable { 

    private static final long serialVersionUID = -7283129128268761582L; 

    private int id; 
    private String login; 
    private String senha; 
    private String primeiroNome; 
    private String ultimoNome; 
    private Tipo tipo; 
    private List<Atributo> atributo; 
    private ConfigHorarioLivre config; 
    private List<Autorizacao> autorizacao; 

    public Usuario() { 
    } 

    public Usuario(String login, String senha) { 
     this.setLogin(login); 
     this.setSenha(senha); 
    } 

    public Usuario(String login, String senha, String primeiroNome, String ultimoNome, Tipo tipo, List<Atributo> atributos) { 
     this.setLogin(login); 
     this.setSenha(senha); 
     this.setPrimeiroNome(primeiroNome); 
     this.setUltimoNome(ultimoNome); 
     this.tipo = tipo; 
     this.atributo = atributos; 
     this.config = new ConfigHorarioLivre(); 
     this.autorizacao = new ArrayList<Autorizacao>(); 
    } 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "login") 
    public String getLogin() { 
     return login; 
    } 

    public void setLogin(String login) { 
     this.login = login; 
    } 

    @Column(name = "senha") 
    public String getSenha() { 
     return senha; 
    } 

    public void setSenha(String senha) { 
     this.senha = senha; 
    } 

    @Column(name = "primeiro_nome") 
    public String getPrimeiroNome() { 
     return primeiroNome; 
    } 

    public void setPrimeiroNome(String primeiroNome) { 
     this.primeiroNome = primeiroNome; 
    } 

    @Column(name = "ultimo_nome") 
    public String getUltimoNome() { 
     return ultimoNome; 
    } 

    public void setUltimoNome(String ultimoNome) { 
     this.ultimoNome = ultimoNome; 
    } 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="fk_tipo") 
    public Tipo getTipo() { 
     return tipo; 
    } 

    public void setTipo(Tipo tipo) { 
     this.tipo = tipo; 
    } 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="atributo_usuario", joinColumns={@JoinColumn(name="fk_usuario")}, inverseJoinColumns={@JoinColumn(name="fk_atributo")}) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    public List<Atributo> getAtributo() { 
     return atributo; 
    } 

    public void setAtributo(List<Atributo> atributo) { 
     this.atributo = atributo; 
    } 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="fk_config") 
    public ConfigHorarioLivre getConfig() { 
     return config; 
    } 

    public void setConfig(ConfigHorarioLivre config) { 
     this.config = config; 
    } 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="autorizacao_usuario", joinColumns={@JoinColumn(name="fk_usuario")}, inverseJoinColumns={@JoinColumn(name="fk_autorizacao")}) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    public List<Autorizacao> getAutorizacao() { 
     return autorizacao; 
    } 

    public void setAutorizacao(List<Autorizacao> autorizacao) { 
     this.autorizacao = autorizacao; 
    } 

} 

而且我現在面臨這個錯誤:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.horariolivre.entity.Key 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:842) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:835) 
    at org.hibernate.engine.spi.CascadingAction$7.cascade(CascadingAction.java:315) 
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:387) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:330) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) 
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) 
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:424) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:263) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:135) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:852) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:826) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:830) 
    at com.horariolivre.dao.AtributoHome.persist(AtributoHome.java:37) 
    at com.horariolivre.dao.AtributoHome$$FastClassByCGLIB$$97541e8a.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) 
    at com.horariolivre.dao.AtributoHome$$EnhancerByCGLIB$$26066f50.persist(<generated>) 
    at com.horariolivre.service.UsuarioService.cadastra(UsuarioService.java:58) 
    at com.horariolivre.controller.UsuarioController.cadastra_usuario(UsuarioController.java:87) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    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:744) 

Abr 09, 2014 7:49:30 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release 
INFO: HHH000010: On release of batch it still contained JDBC statements 
Abr 09, 2014 7:49:30 AM org.apache.catalina.core.StandardWrapperValve invoke 
Grave: Servlet.service() for servlet [dispatcher] in context with path [/HorarioLivre2] threw exception [Request processing failed; nested exception is org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1] with root cause 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:59) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3215) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3117) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3446) 
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:328) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1233) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403) 
    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.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:554) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) 
    at com.horariolivre.dao.AtributoHome$$EnhancerByCGLIB$$26066f50.persist(<generated>) 
    at com.horariolivre.service.UsuarioService.cadastra(UsuarioService.java:58) 
    at com.horariolivre.controller.UsuarioController.cadastra_usuario(UsuarioController.java:87) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    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:744) 

這屬性約鍵位於類Atributo:

@Entity 
@Table(name = "atributo") 
public class Atributo implements java.io.Serializable { 

    private static final long serialVersionUID = 6084758898903241369L; 

    private int id; 
    private Key key; 
    private Value value; 

    public Atributo() { 
    } 

    public Atributo(Key key, Value value) { 
     this.key = key; 
     this.value = value; 
    } 

    public Atributo(String key, String value) { 
     this.key = new Key(key); 
     this.value = new Value(value); 
    } 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="key") 
    public Key getKey() { 
     return key; 
    } 

    public void setKey(Key key) { 
     this.key = key; 
    } 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="value") 
    public Value getValue() { 
     return value; 
    } 

    public void setValue(Value value) { 
     this.value = value; 
    } 

} 

節約運關合作是這樣處理的:

public boolean cadastra(String login, String senha, String primeiroNome, String ultimoNome, String tipoUsuario, String[] campo, String[] valor) { 
    Tipo tipo_usuario = tipo.findByNome(tipoUsuario); 
    List<Atributo> lista_atributos = new ArrayList<Atributo>(); 

    for(int i=0; i<campo.length; i++) { 
     Key chave = key.findByNome(campo[i]); 
     Value conteudo = new Value(valor[i]); 
     value.persist(conteudo); 
     lista_atributos.add(new Atributo(chave, conteudo)); 
     atributo.persist(lista_atributos.get(i)); 
    } 

    return this.usuario.persist(new Usuario(login, senha, primeiroNome, ultimoNome, tipo_usuario, lista_atributos)); 
} 

有人能方向指向堅持這個實體的正確方法?

PS:該項目的全部代碼可以在這裏找到:

https://github.com/klebermo/webapp_horario_livre

+1

看http://stackoverflow.com/questions/18345598/hibernate-manytoone-only-works-with-cascadetype-all/18345715#18345715 –

+0

你如何保存這些entites的?發佈你的代碼。最有可能的是你創建新的對象,然後通過級聯保存多個時間。 – Angga

+0

我用請求的代碼更新了問題?有任何想法嗎? –

回答

0

我終於解決了這個問題。讓我分享這個操作中主要參與者的最終代碼:Usuario.java/Atributo.java和Key/Value。簡而言之,這是關於Atributo類的@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)和Usuario類的fetch=FetchType.LAZY的組合。

Usuario.java

@Entity 
@Table(name = "usuario") 
public class Usuario implements java.io.Serializable { 

    private static final long serialVersionUID = -7283129128268761582L; 

    private int id; 
    private String login; 
    private String senha; 
    private String primeiroNome; 
    private String ultimoNome; 
    private Tipo tipo; 
    private ConfigHorarioLivre config; 
    private List<Atributo> atributo; 
    private List<Autorizacao> autorizacao; 
    private List<HorarioLivre> horario_livre; 

    public Usuario() { 
    } 

    public Usuario(String login, String senha) { 
     this.setLogin(login); 
     this.setSenha(senha); 
    } 

    public Usuario(String login, String senha, String primeiroNome, String ultimoNome, Tipo tipo, List<Atributo> atributos) { 
     this.setLogin(login); 
     this.setSenha(senha); 
     this.setPrimeiroNome(primeiroNome); 
     this.setUltimoNome(ultimoNome); 
     this.tipo = tipo; 
     this.atributo = atributos; 
     this.config = new ConfigHorarioLivre(); 
     this.autorizacao = new ArrayList<Autorizacao>(); 
    } 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "login") 
    public String getLogin() { 
     return login; 
    } 

    public void setLogin(String login) { 
     this.login = login; 
    } 

    @Column(name = "senha") 
    public String getSenha() { 
     return senha; 
    } 

    public void setSenha(String senha) { 
     this.senha = senha; 
    } 

    @Column(name = "primeiro_nome") 
    public String getPrimeiroNome() { 
     return primeiroNome; 
    } 

    public void setPrimeiroNome(String primeiroNome) { 
     this.primeiroNome = primeiroNome; 
    } 

    @Column(name = "ultimo_nome") 
    public String getUltimoNome() { 
     return ultimoNome; 
    } 

    public void setUltimoNome(String ultimoNome) { 
     this.ultimoNome = ultimoNome; 
    } 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="fk_tipo") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    public Tipo getTipo() { 
     return tipo; 
    } 

    public void setTipo(Tipo tipo) { 
     this.tipo = tipo; 
    } 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @JoinTable(name="atributo_usuario", joinColumns={@JoinColumn(name="fk_usuario")}, inverseJoinColumns={@JoinColumn(name="fk_atributo")}) 
    public List<Atributo> getAtributo() { 
     return atributo; 
    } 

    public void setAtributo(List<Atributo> atributo) { 
     this.atributo = atributo; 
    } 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="fk_config") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    public ConfigHorarioLivre getConfig() { 
     return config; 
    } 

    public void setConfig(ConfigHorarioLivre config) { 
     this.config = config; 
    } 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="autorizacao_usuario", joinColumns={@JoinColumn(name="fk_usuario")}, inverseJoinColumns={@JoinColumn(name="fk_autorizacao")}) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    public List<Autorizacao> getAutorizacao() { 
     return autorizacao; 
    } 

    public void setAutorizacao(List<Autorizacao> autorizacao) { 
     this.autorizacao = autorizacao; 
    } 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="horariolivre_usuario", joinColumns={@JoinColumn(name="fk_usuario")}, inverseJoinColumns={@JoinColumn(name="fk_horariolivre")}) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    public List<HorarioLivre> getHorario_livre() { 
     return horario_livre; 
    } 

    public void setHorario_livre(List<HorarioLivre> horario_livre) { 
     this.horario_livre = horario_livre; 
    } 

} 

Atributo.java

@Entity 
@Table(name = "atributo") 
public class Atributo implements java.io.Serializable { 

    private static final long serialVersionUID = 6084758898903241369L; 

    private int id; 
    private Key key; 
    private Value value; 

    public Atributo() { 
    } 

    public Atributo(Key key, Value value) { 
     this.key = key; 
     this.value = value; 
    } 

    public Atributo(String key, String value) { 
     this.key = new Key(key); 
     this.value = new Value(value); 
    } 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="key") 
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
    public Key getKey() { 
     return key; 
    } 

    public void setKey(Key key) { 
     this.key = key; 
    } 

    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="value") 
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
    public Value getValue() { 
     return value; 
    } 

    public void setValue(Value value) { 
     this.value = value; 
    } 

} 

Key.java

@SuppressWarnings("serial") 
@Entity 
@Table(name = "key") 
public class Key implements java.io.Serializable { 

    private int id; 
    private String nome; 

    public Key() { 
    } 

    public Key(String nome) { 
     this.nome = nome; 
    } 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "nome", unique = true, nullable = false) 
    public String getNome() { 
     return nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

} 

Value.java

@Entity 
@Table(name = "value") 
public class Value implements java.io.Serializable { 

    private static final long serialVersionUID = 6515224281217075194L; 

    private int id; 
    private String conteudo; 

    public Value() { 
    } 

    public Value(String conteudo) { 
     this.conteudo = conteudo; 
    } 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "conteudo") 
    public String getConteudo() { 
     return conteudo; 
    } 

    public void setConteudo(String conteudo) { 
     this.conteudo = conteudo; 
    } 
} 
+1

您仍然在服務層中使用分離的實體。也許改變級聯策略有助於這種特殊情況,但設計很容易出錯。另一個問題(更大的問題)是,您將每個實體都保存在單獨的事務中(出於同樣的原因:因爲trx邊界位於DAO上,而不是服務層上)。這可能會導致嚴重的數據完整性問題,以防您在服務方法中出現異常。 – gadget

+0

實際上,在我的項目的當前狀態中,來自Service類的訪問數據庫的方法具有註釋@Transactional。請參閱https://github.com/klebermo/webapp_horario_livre/tree/master/src/com/horariolivre/service –

+0

啊,所以你在任何地方都添加了@Transactional,事實並非如此。這應該已經解決了您的原始問題,而無需更改級聯策略... – gadget

1

你的服務的方法不是事務性的。您的交易在每個DAO方法之前打開並承諾。由於hibernate會話連接到當前事務,因此會話在從DAO方法返回後始終關閉。這會導致服務層中的分離實體。 快速修復只需添加@Transactional到您的服務方法:

@Transactional 
public boolean cadastra(String login, String senha, String primeiroNome, String ultimoNome, String tipoUsuario, String[] campo, String[] valor) { 
... 
} 
相關問題