InvocationTargetException, IOException {
long start = System.currentTimeMillis();
em.invokeEntityListener(o, newObject ? PrePersist.class : PreUpdate.class);
AnnotationInfo ai = em.getFactory().getAnnotationManager().getAnnotationInfo(o);
UpdateCondition expected = null;
PersistentProperty versionField = null;
Integer nextVersion = -1;
String domainName;
if (ai.getRootClass() != null) {
domainName = em.getOrCreateDomain(ai.getRootClass());
} else {
domainName = em.getOrCreateDomain(o.getClass());
}
// Item item = DomainHelper.findItemById(this.em.getSimpleDb(),
// domainName, id);
// now set attributes
List<ReplaceableAttribute> attsToPut = new ArrayList<ReplaceableAttribute>();
List<Attribute> attsToDelete = new ArrayList<Attribute>();
if (ai.getDiscriminatorValue() != null) {
attsToPut.add(new ReplaceableAttribute(EntityManagerFactoryImpl.DTYPE, ai.getDiscriminatorValue(), true));
}
LazyInterceptor interceptor = null;
if (o instanceof Factory) {
Factory factory = (Factory) o;
/*
* for (Callback callback2 : factory.getCallbacks()) {
* if(logger.isLoggable(Level.FINER)) logger.finer("callback=" +
* callback2); if (callback2 instanceof LazyInterceptor) {
* interceptor = (LazyInterceptor) callback2; } }
*/
interceptor = (LazyInterceptor) factory.getCallback(0);
}
for (PersistentProperty field : ai.getPersistentProperties()) {
Object ob = field.getProperty(o);
String columnName = field.getColumnName();
if (ob == null) {
attsToDelete.add(new Attribute(columnName, null));
continue;
}
if (field.isForeignKeyRelationship()) {
// store the id of this object
if (Collection.class.isAssignableFrom(field.getRawClass())) {
for (Object each : (Collection) ob) {
String id2 = em.getId(each);
attsToPut.add(new ReplaceableAttribute(columnName, id2, true));
}
} else {
String id2 = em.getId(ob);
attsToPut.add(new ReplaceableAttribute(columnName, id2, true));
/* check if we should persist this */
boolean persistRelationship = false;
ManyToOne a = field.getGetter().getAnnotation(ManyToOne.class);
if (a != null && null != a.cascade()) {
CascadeType[] cascadeType = a.cascade();
for (CascadeType type : cascadeType) {
if (CascadeType.ALL == type || CascadeType.PERSIST == type) {
persistRelationship = true;
}
}
}
if (persistRelationship) {
em.persist(ob);
}
}
} else if (field.isVersioned()) {
Integer curVersion = Integer.parseInt("" + ob);
nextVersion = (1 + curVersion);
attsToPut.add(new ReplaceableAttribute(columnName, em.padOrConvertIfRequired(nextVersion), true));
if (curVersion > 0)
expected = new UpdateCondition(columnName, em.padOrConvertIfRequired(curVersion), true);
versionField = field;
} else if (field.isInverseRelationship()) {
// FORCING BI-DIRECTIONAL RIGHT NOW SO JUST IGNORE
// ... except for cascading persistence down to all items in the