コード例 #1
0
  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);
  }
コード例 #2
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);
  }
コード例 #3
0
 public void insert(OpenJPAStateManager sm, JDBCStore store, RowManager rm) throws SQLException {
   if (field.getMappedBy() == null || _orderInsert || _orderUpdate)
     insert(sm, rm, sm.fetchObject(field.getIndex()));
 }