2017-02-20 3 views
1

Ich versuche seit Tagen herauszufinden, wie ich ein dauerhaftes Element aus einer Karte entfernen kann. Ich habe Threads mit ähnlichen Problemen gefunden, aber keiner von ihnen würde mir endlich helfen. Alles funktioniert gut, das Element hinzufügen und beibehalten, dieses Element bearbeiten und aktualisieren und so weiter. Außer dem Löschen des Elements. Ich habe einen (Zeit-) Zeitplan mit 5 Karten für jeden Wochentag. Hier sind die wesentlichen Teile des CodesLöschen eines Elements einer Karte mit jpa

Zeitplan:

@Entity 
public class Schedule extends JPAEntity implements Serializable { 

... 
    @OneToMany(mappedBy = "schedule", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "id") 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> monday; 

    @OneToMany(mappedBy = "schedule", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "id") 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> tuesday; 

    @OneToMany(mappedBy = "schedule", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "id") 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> wednesday; 

    @OneToMany(mappedBy = "schedule", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "id") 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> thursday; 

    @OneToMany(mappedBy = "schedule", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "id") 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> friday; 

    public boolean removeSubject(final int index, final SchoolSubject oldSubject) { 
     final String day = oldSubject.getWeekday(); 

     switch (day) { 
     case "Montag": 
      return monday.remove(index, oldSubject); 
     case "Dienstag": 
      return tuesday.remove(index, oldSubject); 
     case "Mittwoch": 
      return wednesday.remove(index, oldSubject); 
     case "Donnerstag": 
      return thursday.remove(index, oldSubject); 
     case "Freitag": 
      return friday.remove(index, oldSubject); 
     } 
     return false; 
    } 

SchoolSubject:

@Entity 
public class SchoolSubject extends JPAEntity implements Serializable { 

    private static final long serialVersionUID = -3554577133392512324L; 

    @Column(nullable = false) 
    private String name; 

    @Basic 
    @Column(nullable = false) 
    private int hourTime; 

    @ManyToOne(optional = false) 
    private Schedule schedule; 

JPAEntity:

@MappedSuperclass 
@EntityListeners(JPAEntityListener.class) 
public class JPAEntity { 


    @Id 
    @GeneratedValue 
    private Long id; 

Also meine Lösch-Methode in einer anderen Logik-Klasse die folgenden:

@Override 
    public void removeSubject(User user, Schedule schedule, SchoolSubject oldSubject) { 
     if (schedule.removeSubject(oldSubject.getHourTime() - 1, oldSubject)) { 
      schoolSubjectDAO.remove(oldSubject); 
     } 

     scheduleDAO.update(schedule); 
     try { 
      userDAO.update(user); 
     } catch (final DuplicateUniqueFieldException e) { 
      throw new UnexpectedUniqueViolationException(e); 
     } 
    } 

Ich war Debuggen der Methode, ich bin erfolgreich das Element aus dem Zeitplan entfernen. Aber scheduleDAO.update(schedule) scheint nicht vollständig zu funktionieren. Wie ich schon sagte, alles funktioniert sonst einwandfrei

UPDATE

Ich folgte Vorschläge jetzt crizzis, es zu einer unidirektionalen Beziehung zu ändern, und das Entfernen des Feld.

Die aktualisierte Zeitplan Klasse:

@Entity 
public class Schedule extends JPAEntity implements Serializable { 

    /** 
    * Die eindeutige SerialisierungsID. 
    */ 
    private static final long serialVersionUID = -3554837193392512324L; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> monday; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> tuesday; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> wednesday; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> thursday; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @MapKey(name = "hourTime") 
    private Map<Integer, SchoolSubject> friday; 

Aber damit habe ich einen neuen Fehler, wenn ein Thema Zugabe (die vorher gearbeitet). Die Additionsoperation ist die folgende:

public void addSubject(User user, Schedule schedule, SchoolSubject subject) 
      throws DateAlreadyOccupiedException { 
     schedule.addSubject(subject.getHourTime() - 1, subject); 
     scheduleDAO.update(schedule); 
     try { 
      userDAO.update(user); 
     } catch (final DuplicateUniqueFieldException e) { 
      throw new UnexpectedUniqueViolationException(e); 
     } 
    } 

Der Fehler Ich habe ist folgendes:

Severe: javax.faces.el.EvaluationException: javax.ejb.EJBTransactionRolledbackException 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at de.unibremen.st.gradelog.filter.AuthorizationFilter.doFilter(AuthorizationFilter.java:94) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.ejb.EJBTransactionRolledbackException 
    at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2342) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2123) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
    at com.sun.proxy.$Proxy613.update(Unknown Source) 
    at de.unibremen.st.gradelog.persistence.__EJB31_Generated__UserDAO__Intf____Bean__.update(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:434) 
    at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:127) 
    at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) 
    at org.jboss.weld.bean.proxy.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.java:67) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 
    at de.unibremen.st.gradelog.persistence.UserDAO$Proxy$_$$_Weld$EnterpriseProxy$.update(Unknown Source) 
    at de.unibremen.st.gradelog.businesslogic.ScheduleManager.addSubject(ScheduleManager.java:56) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64) 
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) 
    at sun.reflect.GeneratedMethodAccessor86.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) 
    at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
    at com.sun.proxy.$Proxy605.addSubject(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:434) 
    at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:127) 
    at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) 
    at org.jboss.weld.bean.proxy.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.java:67) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 
    at de.unibremen.st.gradelog.businesslogic.IScheduleManager$1688850411$Proxy$_$$_Weld$EnterpriseProxy$.addSubject(Unknown Source) 
    at de.unibremen.st.gradelog.controller.ScheduleBean.save(ScheduleBean.java:100) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:289) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304) 
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) 
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) 
    ... 41 more 
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean 
    at com.sun.ejb.containers.EJBContainerTransactionManager.checkExceptionClientTx(EJBContainerTransactionManager.java:666) 
    at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:511) 
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074) 
    ... 109 more 
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Column 'FRIDAY_ID' cannot accept a NULL value. 
Error Code: 20000 
Call: INSERT INTO SCHEDULE_SCHOOLSUBJECT (monday_ID, Schedule_ID) VALUES (?, ?) 
    bind => [2 parameters bound] 
Query: DataModifyQuery(name="monday" sql="INSERT INTO SCHEDULE_SCHOOLSUBJECT (monday_ID, Schedule_ID) VALUES (?, ?)") 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:879) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.performPreQueryFlush(QueryImpl.java:967) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:207) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:473) 
    at de.unibremen.st.gradelog.persistence.UserDAO.getUserForUsername(UserDAO.java:227) 
    at de.unibremen.st.gradelog.persistence.UserDAO.update(UserDAO.java:151) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64) 
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) 
    at sun.reflect.GeneratedMethodAccessor86.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) 
    at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
    ... 107 more 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Column 'FRIDAY_ID' cannot accept a NULL value. 
Error Code: 20000 
Call: INSERT INTO SCHEDULE_SCHOOLSUBJECT (monday_ID, Schedule_ID) VALUES (?, ?) 
    bind => [2 parameters bound] 
Query: DataModifyQuery(name="monday" sql="INSERT INTO SCHEDULE_SCHOOLSUBJECT (monday_ID, Schedule_ID) VALUES (?, ?)") 
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:902) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:964) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:633) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:560) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2055) 
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:306) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:271) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:251) 
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.executeNoSelect(StatementQueryMechanism.java:118) 
    at org.eclipse.persistence.queries.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:85) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:3267) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839) 
    at org.eclipse.persistence.mappings.ManyToManyMapping.insertAddedObjectEntry(ManyToManyMapping.java:630) 
    at org.eclipse.persistence.mappings.ManyToManyMapping.performDataModificationEvent(ManyToManyMapping.java:838) 
    at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:160) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4260) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1441) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithPreBuiltChangeSet(UnitOfWorkImpl.java:1587) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:455) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:874) 
    ... 141 more 
Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'FRIDAY_ID' cannot accept a NULL value. 
    at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.executeUpdate(Unknown Source) 
    at com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:125) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:892) 
    ... 164 more 
Caused by: org.apache.derby.client.am.SqlException: Column 'FRIDAY_ID' cannot accept a NULL value. 
    at org.apache.derby.client.am.Statement.completeExecute(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(Unknown Source) 
    at org.apache.derby.client.net.NetStatementReply.readExecute(Unknown Source) 
    at org.apache.derby.client.net.StatementReply.readExecute(Unknown Source) 
    at org.apache.derby.client.net.NetPreparedStatement.readExecute_(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.readExecute(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.flowExecute(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.executeUpdateX(Unknown Source) 
    ... 167 more 
+0

können Sie das removeSubject impl hinzufügen, und führen Sie die Zusammenführung vor dem Update durch? –

+0

Ja, ich habe den Klassenplan mit der Methode aktualisiert, aber wie ich schon sagte, beim Debugging schien es kein Problem mit dieser Methode zu geben. Das Objekt wurde erfolgreich aus der Zuordnung der Entität entfernt. Die Zusammenführung wird tatsächlich von templateDAO.update (Schedule) ausgeführt, was grundsätzlich die merge() - Methode von 'javax.persistence.EntityManager' ist. Wenn ich ein Element hinzufüge und scheduleDAO.update (schedule) ausführe, funktioniert alles einwandfrei. – Noli

+0

Ich sehe. Welchen Persistenzanbieter verwenden Sie? und was ist die Version? –

Antwort

1

Sie nicht mappedBy so wiederverwenden können. Nachdem Sie fortfahren Schedule und versuchen, es von der db zu laden, hat JPA keine Möglichkeit zu wissen, welche der SchoolSubject Einheiten zu monday gehen, welche gehen zu tuesday und so weiter. Sie versuchen, eine Seite der Beziehung() auf mehrere inverse Seiten (Schedule.monday, Schedule.tuesday, ...) abzubilden. Dies ist in JPA illegal.

Die einzige Möglichkeit, die Zuordnung der Implementierung Sie wollen, dass ich unter Verwendung eines unidirektionale Beziehung (vorzugsweise ohne Joinspalte) wie so denken kann:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@MapKey(name = "hourTime") 
private Map<Integer, SchoolSubject> monday; 
... 

Sie müssen auch das Entfernen Feld insgesamt (als Alternative, um die Beziehung bidirektional zu halten, würden Sie ein Feld in SchoolSubject pro Wochentag benötigen, aber ich vermute, das ist nicht, was Sie wollen).

Auf diese Weise wird JPA die Beziehung zwischen Schedule und SchoolSubject in separaten Join-Tabellen, eine pro jeden Tag der Woche (damit sie nicht durcheinander geraten).Wenn Sie den Join-Spaltenansatz unbedingt benötigen, verwenden Sie eine separate Join-Spalte (monday_id, tuesday_id usw.) für jede Zuordnung (do nicht verwenden Sie den gleichen Spaltennamen, und tun nicht verwenden Sie die Primärschlüssel-Spalte, die ich bin angenommen, die Spalte id heißt).

+0

Danke für die Antwort! Wenn ich versuche, das Problem anzugehen, wie Sie sagten, bekomme ich eine sql-Ausnahme, die besagt, dass die Spalte FRIDAY_ID keinen NULL-Wert akzeptieren kann. Ich habe noch keine Erfahrung mit Datenbankoperationen, wie soll ich jetzt vorgehen? Würde es helfen, wenn ich den gesamten Fehler-Trace poste? – Noli

+0

Es würde helfen, wenn Sie den aktualisierten Code gepostet haben. Ich habe vergessen zu erwähnen, dass im obigen Setup die Join-Spalte nicht als 'nullable = false' deklariert werden kann (auch nicht das 'optional = false' Flag auf der' @ ManyToOne' Seite, falls Sie sich entscheiden, mit ' Feld pro Tag der Woche 'Ansatz) – crizzis

+0

Ich habe den neuen Code aktualisiert. Ich habe nicht die '@ ManyToOne' Relation, wie Sie vorgeschlagen und keine Join-Spalte mit' nullable = false' Also was könnte es sein? – Noli

Verwandte Themen