public void delete(OpenJPAStateManager sm, JDBCStore store, RowManager rm) throws SQLException { if (field.getMappedBy() != null) return; // if nullable, null any existing inverse columns that refer to this obj ValueMapping elem = field.getElementMapping(); ColumnIO io = elem.getColumnIO(); ForeignKey fk = elem.getForeignKey(); if (!elem.getUseClassCriteria() && io.isAnyUpdatable(fk, true)) { assertInversable(); Row row = rm.getAllRows(fk.getTable(), Row.ACTION_UPDATE); row.setForeignKey(fk, io, null); row.whereForeignKey(fk, sm); rm.flushAllRows(row); return; } if (!sm.getLoaded().get(field.getIndex())) return; // update fk on each field value row ClassMapping rel = field.getElementMapping().getTypeMapping(); StoreContext ctx = store.getContext(); Collection objs = toCollection(sm.fetchObject(field.getIndex())); if (objs != null && !objs.isEmpty()) for (Iterator itr = objs.iterator(); itr.hasNext(); ) updateInverse(ctx, itr.next(), rel, rm, sm, 0); }
public void update(OpenJPAStateManager sm, JDBCStore store, RowManager rm) throws SQLException { if (field.getMappedBy() != null && !_orderInsert && !_orderUpdate) return; Object obj = sm.fetchObject(field.getIndex()); ChangeTracker ct = null; if (obj instanceof Proxy) { Proxy proxy = (Proxy) obj; if (Proxies.isOwner(proxy, sm, field.getIndex())) ct = proxy.getChangeTracker(); } Column order = field.getOrderColumn(); // if no fine-grained change tracking then just delete and reinsert // if no fine-grained change tracking or if an item was removed // from an ordered collection, delete and reinsert if (ct == null || !ct.isTracking() || (order != null && !ct.getRemoved().isEmpty())) { delete(sm, store, rm); insert(sm, rm, obj); return; } // null inverse columns for deletes and update them with our oid for // inserts ClassMapping rel = field.getElementMapping().getTypeMapping(); StoreContext ctx = store.getContext(); if (field.getMappedBy() == null) { Collection rem = ct.getRemoved(); for (Iterator itr = rem.iterator(); itr.hasNext(); ) updateInverse(ctx, itr.next(), rel, rm, null, 0); } Collection add = ct.getAdded(); int seq = ct.getNextSequence(); for (Iterator itr = add.iterator(); itr.hasNext(); seq++) updateInverse(ctx, itr.next(), rel, rm, sm, seq); if (order != null) ct.setNextSequence(seq); }
public void insert(OpenJPAStateManager sm, JDBCStore store, RowManager rm) throws SQLException { if (field.getMappedBy() == null || _orderInsert || _orderUpdate) insert(sm, rm, sm.fetchObject(field.getIndex())); }