Andrew, If you want to create such shortcuts, best to create a method, rather than doing it through the modeler. Glad you got it worked out!
Ken > On Feb 12, 2019, at 4:06 PM, Andrew Willerding <awillerd...@itsurcom.com> > wrote: > > I hope I explain this properly and I think I have the issue identified. I > did two things. > > The first, was to delete the NotifyQueue and NotifyEvent objects in the > Modeller and recreate them from the DBEntities and suddenly my problem went > away. Secondly, using the Modeller, I added some "calculated" properties in > the NotifyQueue object and the problem came back. > > The problem went away after again I removed a calculated properties in the > object entity for NotifyQueue. > > What was causing the issue was that I was creating a property with the > Modeller in the NotifyQueue object that was based on the NotifyEvent object > entity with a path NotifyEvent.repeatNotifyInterval. In my mind, the idea > was that I would create a "shortcut" to the NotifyEvent.repeatNotifyInterval > field that would be accessible in the NotifyQueue object so instead of > calling notifyQueue.getNotifyEvent().getNotifyRepeatInterval() I could just > do a call to notifyQueue.getNotifyRepeatInterval(). However, when I was > creating the NotifyQueue objects in my code, the "Phantom" NotifyEvent item > was being created and preventing me from committing the objects. > > Now, instead of trying to do this in the Modeller, I am just adding the > method directly in my NotifyQueue class. I'm not sure what I was trying to > do in the Modeller is something that is supposed to work or not but it > definitely did not work for me. > > Thanks for listening to all my noise on this issue. > > Andrew > > > > On 2019-02-11 10:05 a.m., Andrew Willerding wrote: >> Hi, >> >> Sorry for this long post item but I'm struggling with strange issue I >> haven't encountered before with Cayenne and hopefully I'm providing enough >> detail to get some insight into what my issue is. >> >> A new database object is somehow being created without my explicit creation >> and I don't understand how or why it is happening. Below is the output from >> the cayenne log that will correspond to the code extractions underneath it. >> >> The **first** insert of NotifyEvent is the one I'm intending to create and >> it works correctly. There are a number of data updates/retrievals >> underneath it as I'm accessing some of the objects that will be associated >> with the dependent NotifyQueue objects I wish to connect to the NotifyEvent. >> It's the ***second*** NotifyEvent insertion with all null values is the one >> I don't understand how or where it's being inadvertently created in my code. >> >> 2019-02-11,09:38:28:058,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,INSERT INTO >> NotifyEvent (DTCompleted, DTStart, DTStopBy, clientID, createdDT, >> creatorContactID, defaultLanguage, description, durationMS, isTemplate, >> lockedToMinUserLevel, notes, notifyAppID, notifyAttachments, notifyBody, >> notifyContactID, notifyGroupID, notifyMessageID, notifyRepeatCount, >> notifyRepeatCronValue, notifyRepeatInterval, notifyRepeatMaxTimes, >> notifySubject, params, priority, recipientCountNotified, scheduleID, >> scriptName, statusID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, >> ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) >> 2019-02-11,09:38:28:060,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,[bind: >> 1->DTCompleted:NULL, 2->DTStart:2019-02-11T10:00:15.043278, >> 3->DTStopBy:NULL, 4->clientID:201, 5->createdDT:2019-02-11T09:38:11.230615, >> 6->creatorContactID:200, 7->defaultLanguage:'EN', 8->description:'Callista >> Support created 2019-...', 9->durationMS:0, 10->isTemplate:'false', >> 11->lockedToMinUserLevel:0, 12->notes:'', 13->notifyAppID:2, >> 14->notifyAttachments:'', 15->notifyBody:'', 16->notifyContactID:NULL, >> 17->notifyGroupID:221, 18->notifyMessageID:1, 19->notifyRepeatCount:0, >> 20->notifyRepeatCronValue:';* * * * * /scripts/script.sh', >> 21->notifyRepeatInterval:0, 22->notifyRepeatMaxTimes:0, >> 23->notifySubject:'', 24->params:'', 25->priority:0, >> 26->recipientCountNotified:0, 27->scheduleID:NULL, 28->scriptName:'', >> 29->statusID:1] >> 2019-02-11,09:38:28:061,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,Generated >> PK: NotifyEvent.id = 18 >> 2019-02-11,09:38:28:061,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,=== updated >> 1 row. >> 2019-02-11,09:38:28:061,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,UPDATE >> Client SET lastUpdateDT = ? WHERE id = ? >> 2019-02-11,09:38:28:062,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,[batch >> bind: 1->lastUpdateDT:2019-02-11T09:38:28.044136, 2->id:201] >> 2019-02-11,09:38:28:062,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,=== updated >> 1 row. >> 2019-02-11,09:38:28:062,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,UPDATE >> Contact SET lastUpdateDT = ? WHERE id = ? >> 2019-02-11,09:38:28:062,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,[batch >> bind: 1->lastUpdateDT:2019-02-11T09:38:28.045692, 2->id:200] >> 2019-02-11,09:38:28:063,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,=== updated >> 1 row. >> 2019-02-11,09:38:28:064,DEBUG,[http-nio-8080-exec-129],org.apache.cayenne.access.DataRowStore,postSnapshotsChangeEvent: >> [SnapshotEvent] source: org.apache.cayenne.access.DataRowStore@5b5cf1ec, >> modified 2 id(s), indirectly modified 5 id(s) >> 2019-02-11,09:38:28:068,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,+++ >> transaction committed. >> 2019-02-11,09:38:28:068,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,--- >> transaction started. >> 2019-02-11,09:38:28:069,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,SELECT >> t0.notifyDetail, t0.statusID, t0.contactID, t0.notifyTypeID, t0.id FROM >> ContactCommunication t0 WHERE t0.contactID = ? [bind: 1->contactID:240] >> 2019-02-11,09:38:28:070,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,=== >> returned 3 rows. - took 1 ms. >> 2019-02-11,09:38:28:070,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,+++ >> transaction committed. >> 2019-02-11,09:38:28:073,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,--- >> transaction started. >> 2019-02-11,09:38:28:074,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,INSERT INTO >> NotifyEvent (DTCompleted, DTStart, DTStopBy, clientID, createdDT, >> creatorContactID, defaultLanguage, description, durationMS, isTemplate, >> lockedToMinUserLevel, notes, notifyAppID, notifyAttachments, notifyBody, >> notifyContactID, notifyGroupID, notifyMessageID, notifyRepeatCount, >> notifyRepeatCronValue, notifyRepeatInterval, notifyRepeatMaxTimes, >> notifySubject, params, priority, recipientCountNotified, scheduleID, >> scriptName, statusID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, >> ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) >> 2019-02-11,09:38:28:074,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,[bind: >> 1->DTCompleted:NULL, 2->DTStart:NULL, 3->DTStopBy:NULL, 4->clientID:NULL, >> 5->createdDT:NULL, 6->creatorContactID:NULL, 7->defaultLanguage:NULL, >> 8->description:NULL, 9->durationMS:NULL, 10->isTemplate:NULL, >> 11->lockedToMinUserLevel:NULL, 12->notes:NULL, 13->notifyAppID:NULL, >> 14->notifyAttachments:NULL, 15->notifyBody:NULL, 16->notifyContactID:NULL, >> 17->notifyGroupID:NULL, 18->notifyMessageID:NULL, >> 19->notifyRepeatCount:NULL, 20->notifyRepeatCronValue:NULL, >> 21->notifyRepeatInterval:NULL, 22->notifyRepeatMaxTimes:NULL, >> 23->notifySubject:NULL, 24->params:NULL, 25->priority:NULL, >> 26->recipientCountNotified:NULL, 27->scheduleID:NULL, 28->scriptName:NULL, >> 29->statusID:NULL] >> 2019-02-11,09:38:28:080,INFO >> ,[http-nio-8080-exec-129],org.apache.cayenne.log.JdbcEventLogger,*** error. >> com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: >> Column 'DTStart' cannot be null >> at >> jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native >> Method) ~[?:?] >> at >> jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) >> ~[?:?] >> at >> jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) >> ~[?:?] >> at java.lang.reflect.Constructor.newInstance(Constructor.java:488) ~[?:?] >> >> >> Here's the extract of code that I'm executing that generates the first >> successful notifyEvent object and is now trying to create a number of >> objects that are dependent on it when it executes the >> NotifyQueue.createNotifyQueueItemsForContact method. >> >> notifyEvent.setNotifyRepeatCronValue(";* * * * * >> /scripts/script.sh"); >> >> notifyEvent.getObjectContext().commitChanges(); >> >> listSelectedNotifyQueueItems.clear(); >> if (listAllNotifyQueueItems.isEmpty()) { >> for (Contact listContact : listContacts) { >> listAllNotifyQueueItems.addAll(NotifyQueue.createNotifyQueueItemsForContact(notifyEvent, >> listContact, listNotifyTypes, 0)); >> } >> } >> >> Here is the NotifyQueue.createNotifyQueueItemsForContact code extract with >> some of my debug output statements... The oc.committChanges() triggers the >> exception that appears in the debug. >> >> public static List<NotifyQueue> >> createNotifyQueueItemsForContact(NotifyEvent notifyEvent, Contact contact, >> List<NotifyType> listToNotifyType, int priority) { >> HashMap<String, NotifyQueue> result = new HashMap<>(); >> ObjectContext oc = notifyEvent.getObjectContext(); >> if (oc.hasChanges()){ >> System.out.println("OC HAS CHANGES!!!"); >> for (Object modifiedObject : oc.modifiedObjects()) { >> System.out.println("Modified object->" + modifiedObject); >> } >> } >> >> for (NotifyType notifyType : listToNotifyType) { >> if (notifyType.isEmail()) { >> if (!contact.getEmail().isEmpty() >> && !result.containsKey(contact.getEmail())) { >> if (contact.isNotifyActive(contact.getEmail())) { >> NotifyQueue item = oc.newObject(NotifyQueue.class); >> item.setAttemptCount(0); >> // item.setDTStart(notifyEvent.getDTStart()); >> item.setClient(User.getLoggedInUser().getClient()); >> item.setNotifyEvent(notifyEvent); >> System.out.println("***NotifyEvent-"+ notifyEvent.getDTStart()); >> item.setNotifyType(notifyType); >> item.setNotifyContact(contact); >> item.setNotifyRecipient(contact.getEmail()); >> item.setPriority(priority); >> item.setStatusID(EnumNotifyStatus.CREATING.toShort()); >> if (oc.hasChanges()){ >> System.out.println("OC HAS CHANGES!!!"); >> for (Object modifiedObject : oc.modifiedObjects()) { >> System.out.println("Modified object->" + modifiedObject); >> } >> } >> oc.commitChanges(); >> result.put(item.getNotifyRecipient(), item); >> } >> } >> >> And this is what appears in my Console from the System.out statements. >> There isn't an object in the OC has changes that references the second >> NotifyEvent object creation with all it's null values so I don't understand >> where it's being created and the intended notifyEvent object has the non >> null value of DTStart. >> >> ***NotifyEvent-2019-02-11T10:00:15.043278 >> OC HAS CHANGES!!! >> Modified object->Name >> Modified object->CCT Inc. >> Modified object->Email >> Modified object->CCT Support created 2019-02-11 09:38:28(18) >> 2019-02-11,09:38:28:072,DEBUG,[http-nio-8080-exec-129],app,ORMCayenne >> getObjectContext() retrieved for current thread >> Feb 11, 2019 9:38:28 AM com.vaadin.server.DefaultErrorHandler doDefault >> SEVERE: >> org.apache.cayenne.CayenneRuntimeException: [v.4.1.M2 Jul 11 2018 14:31:15] >> Commit Exception >> >> Any help would be greatly appreciated. >> >> Thanks, >> >> Andrew >> >>