So, I don’t know if Cayenne does this, but WebObjects used to create phantom 
objects too…

The reason it did it was because there was a mandatory to-one relationship in 
the model, where the primary key of the source of the relationship was also the 
primary key of the related object.

This is not a good modeling technique (the mandatory to-one should have it’s 
own primary key). Does your model have this particular issue?

> On Feb 11, 2019, at 10:05 AM, Andrew Willerding <awillerd...@itsurcom.com> 
> 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
> 
> 

Reply via email to