illegal access to loading collection
mwalbrun Jan 14, 2008 12:31 PMHi all,
i have the following problem. I have an EJB 3.0 successfully running on windows. now i copied the project onto my mac with mac os x leopard and when i start it get the following exception
18:17:31,669 ERROR [LazyInitializationException] illegal access to loading collection org.hibernate.LazyInitializationException: illegal access to loading collection at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341) at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189) at de.optitool.domain.sys.Schedule.addEntry(Schedule.java:234) at de.optitool.domain.sys.ScheduleEntry.setSchedule(ScheduleEntry.java:316) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42) at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337) at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200) at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854) at org.hibernate.loader.Loader.doQuery(Loader.java:729) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64) at de.optitool.session.biz.tp.OrderSessionBean.test(OrderSessionBean.java:76) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) at org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:335) at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166) 18:17:44,151 ERROR [STDERR] javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of de.optitool.domain.sys.ScheduleEntry.schedule 18:17:44,153 ERROR [STDERR] at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629) 18:17:44,155 ERROR [STDERR] at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:73) 18:17:44,156 ERROR [STDERR] at de.optitool.session.biz.tp.OrderSessionBean.test(OrderSessionBean.java:76) 18:17:44,157 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 18:17:44,158 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 18:17:44,159 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 18:17:44,159 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 18:17:44,160 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 18:17:44,161 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 18:17:44,162 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 18:17:44,163 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,164 ERROR [STDERR] at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57) 18:17:44,165 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,166 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 18:17:44,166 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,167 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 18:17:44,168 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,169 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) 18:17:44,169 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) 18:17:44,170 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,171 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95) 18:17:44,171 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,172 ERROR [STDERR] at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83) 18:17:44,173 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,174 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) 18:17:44,175 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) 18:17:44,175 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,176 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) 18:17:44,177 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,178 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) 18:17:44,178 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 18:17:44,179 ERROR [STDERR] at org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:335) 18:17:44,180 ERROR [STDERR] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) 18:17:44,180 ERROR [STDERR] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) 18:17:44,181 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769) 18:17:44,182 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573) 18:17:44,183 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373) 18:17:44,183 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166) 18:17:44,184 ERROR [STDERR] Caused by: org.hibernate.PropertyAccessException: Exception occurred inside setter of de.optitool.domain.sys.ScheduleEntry.schedule 18:17:44,185 ERROR [STDERR] at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65) 18:17:44,186 ERROR [STDERR] at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337) 18:17:44,187 ERROR [STDERR] at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200) 18:17:44,188 ERROR [STDERR] at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566) 18:17:44,188 ERROR [STDERR] at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129) 18:17:44,189 ERROR [STDERR] at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854) 18:17:44,190 ERROR [STDERR] at org.hibernate.loader.Loader.doQuery(Loader.java:729) 18:17:44,190 ERROR [STDERR] at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 18:17:44,191 ERROR [STDERR] at org.hibernate.loader.Loader.doList(Loader.java:2220) 18:17:44,192 ERROR [STDERR] at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 18:17:44,192 ERROR [STDERR] at org.hibernate.loader.Loader.list(Loader.java:2099) 18:17:44,193 ERROR [STDERR] at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) 18:17:44,194 ERROR [STDERR] at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) 18:17:44,194 ERROR [STDERR] at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) 18:17:44,195 ERROR [STDERR] at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) 18:17:44,196 ERROR [STDERR] at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) 18:17:44,196 ERROR [STDERR] at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64) 18:17:44,197 ERROR [STDERR] ... 36 more 18:17:44,198 ERROR [STDERR] Caused by: java.lang.reflect.InvocationTargetException 18:17:44,198 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 18:17:44,199 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 18:17:44,200 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 18:17:44,200 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 18:17:44,201 ERROR [STDERR] at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42) 18:17:44,202 ERROR [STDERR] ... 52 more 18:17:44,202 ERROR [STDERR] Caused by: org.hibernate.LazyInitializationException: illegal access to loading collection 18:17:44,203 ERROR [STDERR] at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341) 18:17:44,204 ERROR [STDERR] at org.hibernate.collection.PersistentSet.add(PersistentSet.java:189) 18:17:44,204 ERROR [STDERR] at de.optitool.domain.sys.Schedule.addEntry(Schedule.java:234) 18:17:44,205 ERROR [STDERR] at de.optitool.domain.sys.ScheduleEntry.setSchedule(ScheduleEntry.java:316) 18:17:44,206 ERROR [STDERR] ... 57 more
My two Entities are as follows...
package de.optitool.domain.sys; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.TableGenerator; import javax.persistence.Transient; import javax.persistence.Version; import de.optitool.common.exception.VetoException; import de.optitool.common.sys.ISchedule; import de.optitool.common.sys.IScheduleEntry; import de.optitool.common.sys.ScheduleEntryEndComparator; import de.optitool.common.sys.ScheduleEntryStartComparator; @Entity @Table(name="schedule") public class Schedule implements java.io.Serializable, ISchedule { private static final long serialVersionUID = 6197633623641866232L; private int scheduleId; private short jdoVersion; private Set<ScheduleEntry> scheduleEntries = new HashSet<ScheduleEntry>(); public Schedule() { } public Schedule(Set<ScheduleEntry> scheduleEntries) { this.scheduleEntries = scheduleEntries; } @TableGenerator(name="schedule", table="jdo_keygen", pkColumnName="table_name", valueColumnName="last_used_id", pkColumnValue="schedule", allocationSize=10) @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="schedule") @Column(name="schedule_id", unique=true, nullable=false) public int getScheduleId() { return this.scheduleId; } protected void setScheduleId(int scheduleId) { this.scheduleId = scheduleId; } @Version @Column(name="jdo_version", nullable=false) protected short getJdoVersion() { return this.jdoVersion; } protected void setJdoVersion(short jdoVersion) { this.jdoVersion = jdoVersion; } /** * @see net.uniopt.sys.ISchedule#getEntries() */ @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="schedule") public Set<ScheduleEntry> getScheduleEntries() { return this.scheduleEntries; } public void setScheduleEntries(Set<ScheduleEntry> scheduleEntries) { this.scheduleEntries = scheduleEntries; } //Methods I do not know why they are in here /** * @param entry */ public void entryChanged (IScheduleEntry entry) { // We do nothing here, at the moment. // setStartEndTime(); } /** * @return First second that's contained by this schedule. */ @Transient private Date calcStartTime() { // Get the list of entries sorted ascending by their begin List<IScheduleEntry> list = getEntries (new ScheduleEntryStartComparator()); if (list == null || list.isEmpty()) return null; // Take the first one from the list IScheduleEntry item = (IScheduleEntry)list.get (0); Date d = item.getStartDate(); if (d == null) return null; Calendar cres = Calendar.getInstance(); // Set the date part first Calendar dc = Calendar.getInstance(); dc.setTime (d); cres.set (Calendar.YEAR, dc.get (Calendar.YEAR)); cres.set (Calendar.MONTH, dc.get (Calendar.MONTH)); cres.set (Calendar.DATE, dc.get (Calendar.DATE)); // Ignore milliseconds cres.set (Calendar.MILLISECOND, 0); // Set the time part, if startTime of the entry is null we set it to 00:00:00 d = item.getStartTime(); if (d == null) { cres.set (Calendar.MINUTE, 0); cres.set (Calendar.SECOND, 0); cres.set (Calendar.HOUR_OF_DAY, 0); } else { Calendar tc = Calendar.getInstance(); tc.setTime (d); cres.set (Calendar.HOUR_OF_DAY, tc.get (Calendar.HOUR_OF_DAY)); cres.set (Calendar.MINUTE, tc.get (Calendar.MINUTE)); cres.set (Calendar.SECOND, tc.get (Calendar.SECOND)); } return cres.getTime(); } /** * @return Last second that's contained by this schedule */ @Transient private Date calcEndTime() { // Get the list of entries sorted ascending by their end date List<IScheduleEntry> list = getEntries (new ScheduleEntryEndComparator()); if (list == null || list.isEmpty()) return null; // Take the last one from the list IScheduleEntry item = (IScheduleEntry)list.get (list.size()-1); Date d = item.getEndDate(); if (d == null) return null; Calendar cres = Calendar.getInstance(); // Set the date part Calendar dc = Calendar.getInstance(); dc.setTime (d); cres.set (Calendar.YEAR, dc.get (Calendar.YEAR)); cres.set (Calendar.MONTH, dc.get (Calendar.MONTH)); cres.set (Calendar.DATE, dc.get (Calendar.DATE)); // Ignore milliseconds cres.set (Calendar.MILLISECOND, 0); // Set the time part, if endTime of entry is null we set it to 24:00:00 d = item.getEndTime(); if (d != null) { Calendar tc = Calendar.getInstance(); tc.setTime (d); cres.set (Calendar.HOUR_OF_DAY, tc.get (Calendar.HOUR_OF_DAY)); cres.set (Calendar.MINUTE, tc.get (Calendar.MINUTE)); cres.set (Calendar.SECOND, tc.get (Calendar.SECOND)); } else { cres.set (Calendar.MINUTE, 0); cres.set (Calendar.SECOND, 0); cres.set (Calendar.HOUR_OF_DAY, 24); } return cres.getTime(); } /** * Create a Date object from the given date anyDate and * initialize the time part with the given seconds of day. * @param anyDate - date used to initialize the date part (y,m,d) * @param second - second of the day, used to initialize the time part (h,m,s) * @return - the date object just created */ @Transient private Date generateTime (Date anyDate, int second) { if (anyDate == null) anyDate = new Date(); // if no date given we take today. Calendar calendar = Calendar.getInstance(); calendar.setTime (anyDate); calendar.set (Calendar.HOUR_OF_DAY, second/3600); second %= 3600; calendar.set (Calendar.MINUTE, second/60); second %= 60; calendar.set (Calendar.SECOND, second); return calendar.getTime(); } /** * @param entry * @return */ @Transient protected boolean isCompatible (ScheduleEntry entry) { // TODO If this new entry completely overlaps another or another is completely overlapped // TODO by the new one false is to be returned! return true; } //Methods implemented by the Interface @Transient /** * @see net.uniopt.sys.ISchedule#getEntries() */ public Set<IScheduleEntry> getEntries() { Set<IScheduleEntry> set = new HashSet<IScheduleEntry>(); if (scheduleEntries != null && !scheduleEntries.isEmpty()) set.addAll (scheduleEntries); return set; } /** * @see net.uniopt.sys.ISchedule#addEntry(net.uniopt.sys.IScheduleEntry) */ @Transient public boolean addEntry (IScheduleEntry entry) { if (scheduleEntries == null) scheduleEntries = new HashSet<ScheduleEntry>(17); boolean added = entry instanceof ScheduleEntry ? scheduleEntries.add ((ScheduleEntry)entry) : false; if (added) entry.setSchedule (this); return added; } /** * Convinience method for {@link #createEntry(Date, int, Date, int, int)} with the note set to null * and the all days of the week selected. * @param startDate - Day the timeframe begins (time part is ignored). * @param startSecond - Second of the day the timeframe begins (every day). * @param endDate - Day the interval ends (time part is ignored). * @param endSecond - Second of the day the timeframe ends every day. * @param dowIndicator - a bitmap of day-of-the-week constants defined by the ISchedule interface. * @return The new entry or null if it cannot be created or is not compatible. * @throws VetoException * * @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int) */ @Transient public IScheduleEntry createEntry (Date startDate, int startSecond, Date endDate, int endSecond) throws VetoException { return createEntry (startDate, startSecond, endDate, endSecond, ISchedule.ALLDAYS, null); } /** * Convinience method for {@link #createEntry(Date, int, Date, int, int, String)} with the note set to null. * @param startDate - Day the timeframe begins (time part is ignored). * @param startSecond - Second of the day the timeframe begins (every day). * @param endDate - Day the interval ends (time part is ignored). * @param endSecond - Second of the day the timeframe ends every day. * @param dowIndicator - a bitmap of day-of-the-week constants defined by the ISchedule interface. * @return The new entry or null if it cannot be created or is not compatible. * @throws VetoException * * @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int, int) */ @Transient public IScheduleEntry createEntry (Date startDate, int startSecond, Date endDate, int endSecond, int dowIndicator) throws VetoException { return createEntry (startDate, startSecond, endDate, endSecond, dowIndicator, null); } /** * Create a new entry (timeframe) within this schedule. * If the new entry is not compatible with the existing ones null is returned. * (e.g., it completely overlaps an older one or is completely overlapped by an older one) * @param startDate - Day the timeframe begins (time part is ignored). * @param startSecond - Second of the day the timeframe begins (every day). * @param endDate - Day the interval ends (time part is ignored). * @param endSecond - Second of the day the timeframe ends every day. * @param dowIndicator - a bitmap of day-of-the-week constants defined by the ISchedule interface. * @param note - An arbitrary annotation. * @return The new entry or null if it cannot be created or is not compatible. * @throws VetoException * * @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int, int, java.lang.String) */ @Transient public IScheduleEntry createEntry (Date startDate, int startSecond, Date endDate, int endSecond, int dowIndicator, String note) throws VetoException { return createEntry (startDate, generateTime (startDate, startSecond), endDate, generateTime (endDate, endSecond), dowIndicator, note ); } /** * @throws VetoException * * @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, java.lang.Integer, java.util.Date, java.lang.Integer, int, java.lang.String) */ @Transient public IScheduleEntry createEntry (Date startDate, Integer startSecond, Date endDate, Integer endSecond, int dowIndicator, String note) throws VetoException { int tStart = startSecond == null ? 0 : startSecond.intValue(); int tEnd = endSecond == null ? 86400 : endSecond.intValue(); ScheduleEntry entry = (ScheduleEntry)createEntry (startDate, tStart, endDate, tEnd, dowIndicator, note); return entry; } /** * Create a new entry (timeframe) within this schedule. * If the new entry is not compatible with the existing ones null is returned. * (e.g., it completely overlaps an older one or is completely overlapped by an older one) * @param startDate - Day the timeframe begins (time part is ignored). * @param startTime - Time of the day the timeframe begins (every day), i.e., the date-part is ignored * @param endDate - Day the interval ends (time part is ignored). * @param endTime - Time of the day the timeframe ends every day, i.e., the date-part is ignored * @param dow - a bitmap of day-of-the-week constants defined by the ISchedule interface. * @param note - An arbitrary annotation. * @return The new entry or null if it cannot be created or is not compatible. * @throws VetoException * * @see net.uniopt.sys.ISchedule#createEntry(java.util.Date, int, java.util.Date, int, int, java.lang.String) */ @Transient public IScheduleEntry createEntry (Date startDate, Date startTime, Date endDate, Date endTime, int dow, String note) throws VetoException { ScheduleEntry entry = new ScheduleEntry(); entry.setValues (startDate, startTime, endDate, endTime); entry.setDow (dow); entry.setNote (note); if (isCompatible (entry)) { entry.setSchedule (this); addEntry (entry); return entry; } return null; } /** * @see net.uniopt.sys.ISchedule#getEarliest() */ @Transient public IScheduleEntry getEarliest () { List<IScheduleEntry> ents = new ArrayList<IScheduleEntry> (getEntries()); if (ents.isEmpty()) return null; Collections.sort (ents, new ScheduleEntryStartComparator()); return ents.get(0); } /** * @return The last moment managed by the schedule. * * @see net.uniopt.sys.ISchedule#getEndTime() */ @Transient public Date getEndTime() { return calcEndTime(); } /** * @see net.uniopt.sys.ISchedule#getEntries(java.util.Comparator) */ @Transient public List<IScheduleEntry> getEntries (Comparator<IScheduleEntry> sortedBy) { Set<IScheduleEntry> c = getEntries(); List<IScheduleEntry> sortedEntries = c == null ? new ArrayList<IScheduleEntry>() : new ArrayList<IScheduleEntry> (c); if (sortedBy!=null) Collections.sort (sortedEntries, sortedBy); return sortedEntries; } /** * Returns all schedule entries (timeframes), that contain the given point in time. * @param date - The date part of the point in time of interest * @param minute - The minute of the day of the moment of interest. * @return - All entries containing the given moment. * * @see net.uniopt.sys.ISchedule#getEntriesContaining(java.util.Date, int) */ @Transient public List<IScheduleEntry> getEntriesContaining (Date date, int minute) { ArrayList<IScheduleEntry> list = new ArrayList<IScheduleEntry>(); for (IScheduleEntry entry : getEntries()) { if (entry instanceof ScheduleEntry && ((ScheduleEntry)entry).contains (date, minute)) list.add (entry); } return list; } /** * @see net.uniopt.sys.ISchedule#getLatest() */ @Transient public IScheduleEntry getLatest() { List<IScheduleEntry> ents = new ArrayList<IScheduleEntry> (getEntries()); if (ents.isEmpty()) return null; Collections.sort (ents, new ScheduleEntryEndComparator()); return ents.get(0); } /** * @return The first moment that's part of the schedule. * * @see net.uniopt.sys.ISchedule#getStartTime() */ @Transient public Date getStartTime() { return calcStartTime(); } /** * @see net.uniopt.sys.ISchedule#isEmpty() */ @Transient public boolean isEmpty() { return (scheduleEntries == null || scheduleEntries.isEmpty()); } /** * @see net.uniopt.sys.ISchedule#removeAll() */ @Transient public void removeAll() { Collection<IScheduleEntry> c = getEntries(); if (c != null && !c.isEmpty()) { Iterator<?> it = c.iterator(); while (it.hasNext()) removeEntry ((IScheduleEntry)it.next()); } } /** * @see net.uniopt.sys.ISchedule#removeEntry(net.uniopt.sys.IScheduleEntry) */ @Transient public boolean removeEntry (IScheduleEntry entry) { boolean removed = (scheduleEntries == null ? false : scheduleEntries.remove (entry)); if (removed) entry.setSchedule (null); return removed; } }
package de.optitool.domain.sys; import java.util.Calendar; import java.util.Comparator; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.TableGenerator; import javax.persistence.Transient; import javax.persistence.Version; import de.optitool.common.exception.VetoException; import de.optitool.common.sys.ISchedule; import de.optitool.common.sys.IScheduleEntry; import de.optitool.common.util.TimeUtil; @Entity @Table(name="schedule_entry") public class ScheduleEntry implements java.io.Serializable, IScheduleEntry { private static final long serialVersionUID = 6000616020745378569L; private int scheduleEntryId; private Schedule schedule; private int down; private Date endDate; private Date endTime; private Date startDate; private Date startTime; private boolean up; private String note; private short jdoVersion; /** Days of the week this entry matters.*/ private int dow=Schedule.WORKINGDAYS; public ScheduleEntry() { } public ScheduleEntry(Schedule schedule, int down, boolean up) { this.schedule = schedule; this.down = down; this.up = up; } public ScheduleEntry(Schedule schedule, int down, Date endDate, Date endTime, Date startDate, Date startTime, boolean up, String note) { this.schedule = schedule; this.down = down; this.endDate = endDate; this.endTime = endTime; this.startDate = startDate; this.startTime = startTime; this.up = up; this.note = note; } @TableGenerator(name="schedule_entry", table="jdo_keygen", pkColumnName="table_name", valueColumnName="last_used_id", pkColumnValue="schedule_entry", allocationSize=10) @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="schedule_entry") @Column(name="schedule_entry_id", unique=true, nullable=false) public int getScheduleEntryId() { return this.scheduleEntryId; } protected void setScheduleEntryId(int scheduleEntryId) { this.scheduleEntryId = scheduleEntryId; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="schedule_id", nullable=false) public Schedule getSchedule() { return this.schedule; } public void setSchedule(Schedule schedule) { this.schedule = schedule; } @Column(name="dow", nullable=false) public int getDown() { return this.down; } public void setDown(int down) { this.down = down; } @Column(name="end_date", length=19) public Date getEndDate() { return this.endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } @Column(name="end_time", length=19) public Date getEndTime() { return this.endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } @Column(name="start_date", length=19) public Date getStartDate() { return this.startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } @Column(name="start_time", length=19) public Date getStartTime() { return this.startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } @Column(name="u", nullable=false) public boolean isUp() { return this.up; } public void setUp(boolean up) { this.up = up; } @Column(name="note") public String getNote() { return this.note; } public void setNote(String note) { this.note = note; } @Version @Column(name="jdo_version", nullable=false) protected short getJdoVersion() { return this.jdoVersion; } protected void setJdoVersion(short jdoVersion) { this.jdoVersion = jdoVersion; } //Methods I do not know /** * Does this schedule entry (timeframe) contain the given point in time. * @param date - The date part (year,month,day) of the point in time. * @param minute - Minute of the day of the point in time. * @return Whether this timeframe contains the given point in time. */ public boolean contains (Date date, int minute) { if (startDate != null && date.before (startDate)) return false; if (endDate != null && date.after (endDate)) return false; Calendar c = Calendar.getInstance(); c.setTime (date); if ((TimeUtil.encode (c.get (Calendar.DAY_OF_WEEK)) & dow) == 0) return false; // If startTime is null it's assumed 0 a.m., so the given minute can't be before but still the same day if (startTime != null) { c.setTime (startTime); int min = c.get (Calendar.HOUR_OF_DAY) * 60 + c.get (Calendar.MINUTE); if (minute < min) return false; } // If endTime is null it's assumed midnight, so the given minute can't be after but still the same day if (endTime != null) { c.setTime (endTime); int min = c.get (Calendar.HOUR_OF_DAY) * 60 + c.get (Calendar.MINUTE); if (minute > min) return false; } return true; } /** * Checks two given date/time pairs if they would make a valid ScheduleEntry. * <br> * The following criteria is checked: * <ul> * <li> if both date parts are given, the startDate/startTime must be before endDate/endTime </li> * <li> if no date parts are given, startTime must be before endTime </li> * <li> if only one date part is given, there is no further restriction on time parts. * </ul> */ protected boolean isValidScheduleEntry (Date startDate, Date startTime, Date endDate, Date endTime) { Date startDateTime = TimeUtil.combine (startDate, startTime); Date endDateTime = TimeUtil.combine (endDate, endTime); if ((startDateTime != null) && (endDateTime != null)) { // both Date parts given, startDateTime must be before endDateTime return (startDateTime.compareTo (endDateTime) <= 0); } else if ((startDate == null) && (endDate == null)) { if ((startTime != null) && (endTime != null)) { // no Date parts given, startTime must be before endTime Date startTimePart = TimeUtil.makeDate(null, startTime); // sets date part to 1.1.1970 Date endTimePart = TimeUtil.makeDate(null, endTime); // sets date part to 1.1.1970 return (startTimePart.compareTo (endTimePart) <= 0); } } return true; } //Implemented by the interface /** * Compare this with another ScheduleEntry using the given Comparator * @param entry * @return 0 if equal, 1 if this is later, -1 if this is earlier * * @see net.uniopt.sys.IScheduleEntry#compareTo(net.uniopt.sys.IScheduleEntry, java.util.Comparator) */ @Transient public int compareTo (IScheduleEntry entry, Comparator<IScheduleEntry> comparator) { return comparator.compare (this, entry); } /** * @see net.uniopt.sys.IScheduleEntry#getDow() */ @Transient public int getDow() { return dow; } /** * @see net.uniopt.sys.IScheduleEntry#getEndDateTime() */ @Transient public Date getEndDateTime () { return TimeUtil.combine (getEndDate(), getEndTime()); } /** * @see net.uniopt.sys.IScheduleEntry#getStartDateTime() */ @Transient public Date getStartDateTime () { return TimeUtil.combine (getStartDate(), getStartTime()); } /** * @see net.uniopt.sys.IScheduleEntry#setDates(java.util.Date, java.util.Date) */ @Transient public void setDates (Date startDate, Date endDate) throws VetoException { setValues(startDate, this.startTime, endDate, this.endTime); } /** * @see net.uniopt.sys.IScheduleEntry#setDow(int) */ @Transient public void setDow (int i) { if (dow != i) { dow = i; if( schedule != null ) schedule.entryChanged (this); } } /** * Sets the end date/time to the given values. * If time is null, the value "23:59:59" is used. * * @see net.uniopt.sys.IScheduleEntry#setEnd(java.util.Date, java.util.Date) */ @Transient public void setEnd (Date date, Date time) throws VetoException { if (time == null) time = TimeUtil.makeTime(23,59,59); if ( !isValidScheduleEntry( startDate, startTime, date, time ) ) { throw new VetoException ("Schedule End cannot be before Schedule Begin."); } endDate = date; endTime = time; if( schedule != null ) schedule.entryChanged (this); } /** * @see net.uniopt.sys.IScheduleEntry#setSchedule(net.uniopt.sys.ISchedule) */ @Transient public void setSchedule (ISchedule other) { if (other != null && !(other instanceof Schedule)) throw new RuntimeException ("Cannot set instance of \""+other.getClass().getName()+"\" as parent of a " + getClass().getName()+"."); if (other != schedule) { if (schedule != null) schedule.removeEntry (this); schedule = (Schedule)other; if (schedule != null) schedule.addEntry (this); } } /** * Sets the start date/time to the given values. * If time is null, the value "00:00:00" is used. * * @see net.uniopt.sys.IScheduleEntry#setStart(java.util.Date, java.util.Date) */ @Transient public void setStart(Date date, Date time) throws VetoException { if (time == null) time = TimeUtil.makeTime(0,0,0); if ( !isValidScheduleEntry( date, time, endDate, endTime ) ) { throw new VetoException ("Schedule End cannot be before Schedule Begin."); } startDate = date; startTime = time; if( schedule != null ) schedule.entryChanged (this); } /** * @see net.uniopt.sys.IScheduleEntry#setTimes(java.util.Date, java.util.Date) */ @Transient public void setTimes (Date startTime, Date endTime) throws VetoException { setValues(this.startDate, startTime, this.endDate, endTime); } /** * @see net.uniopt.sys.IScheduleEntry#setValues(java.util.Date, java.util.Date, java.util.Date, java.util.Date) */ @Transient public void setValues (Date startDate, Date startTime, Date endDate, Date endTime) throws VetoException { Date oldStartDate = this.startDate; Date oldStartTime = this.startTime; Date oldEndDate = this.endDate; Date oldEndTime = this.endTime; setEnd(null, null); // To bypass the validation setStart(startDate, startTime); // should always work now. try { setEnd(endDate, endTime); // This time a validation is done. } catch (VetoException xc) { this.startDate = oldStartDate; this.startTime = oldStartTime; this.endDate = oldEndDate; this.endTime = oldEndTime; throw xc; } if( schedule != null ) schedule.entryChanged (this); } }
the method which invokes the loading looks like this
public void test () { Query query = em.createQuery("SELECT s FROM Schedule s LEFT JOIN FETCH s.scheduleEntries "); try { Set<Tour> resultSet = new HashSet<Tour>(query.getResultList()); Iterator<?> iter = resultSet.iterator(); while (iter.hasNext()) { Schedule schedule = (Schedule) iter.next(); System.out.println(schedule.getScheduleId() + " " + schedule.getScheduleEntries().size()); } } catch (Exception ex) { ex.printStackTrace(); } }
So I am really confused because it works on windows but not on my mac...
This can´t be the topic or?
Thanks for your help!
regards
markus