Hi Nikita,
Based on what you said below, I rebuilt my Database Schema from scratch
but now I'm getting the error below. The validation is failing the line 34
ClientBaseAdmin.getObjectContext().commitChanges();
because of the line 418
cl.setCommunicationType(CommunicationType.find("Email"));
To me it looks like the commit can't happen in the child record because
the commit from the parent record is incomplete and no record is created
at all.
Andrew
Caused by: org.apache.cayenne.validation.ValidationException: [v.4.0.B1
Jun 02 2017 15:11:18] Validation failures: Validation failure for
com.callistacti.clientbase.Database.CommunicationLog.communicationType:
"communicationType" is required.
Validation failure for
com.callistacti.clientbase.Database.CommunicationLog.communicationType:
"communicationType" is required.
at
org.apache.cayenne.access.ObjectStoreGraphDiff.validateAndCheckNoop(ObjectStoreGraphDiff.java:113)
at
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:734)
at
org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:691)
at
com.callistacti.clientbase.Database.CommunicationType.find(CommunicationType.java:34)
at
com.callistacti.clientbase.Panel.PanelGroups.windowClose(PanelGroups.java:418)
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.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
On 18/09/17 11:40 AM, Nikita Timofeev wrote:
Hi Andrew,
Can you provide stack trace for the exception you got (Cayenne related
part of it)?
It seems to me that you have problem with PK generation, not with your
data objects.
Your code looks fine to me and should work.
On Mon, Sep 18, 2017 at 6:30 PM, Andrew Willerding
<[email protected]> wrote:
Hi,
I am trying to create a DB record where a dependency record may not yet
exist and I'm getting a "No rows for ..." error. I don't understand how I
should create the child record that will be used for the parent object so it
can be referenced by the parent object without getting an error. The idea
is to dynamically create a child record as needed.
Thanks,
Andrew
Example code:
ObjectContext oc = ClientBaseAdmin.getObjectContext();
CommunicationLog cl = oc.newObject(CommunicationLog.class);
cl.setCommunicationDT(LocalDateTime.now());
cl.setCommunicationType(CommunicationType.find("Email"));
oc.commitChanges();
and in CommunicationType I have
public static CommunicationType find(String value) {
CommunicationType result = null;
result = ObjectSelect.query(CommunicationType.class)
.where(CommunicationType.DESCRIPTION.eq(value))
.selectFirst(ClientBaseAdmin.getObjectContext());
if (result == null) {
CommunicationType ct =
ClientBaseAdmin.getObjectContext().newObject(CommunicationType.class);
ct.setDescription(value);
ClientBaseAdmin.getObjectContext().commitChanges();
result = ct;
}
return result;
}