1

当我们将包含子实体的父实体对象保存为一对多映射时,只有父实体会插入数据库中。

下面是 postInsert(DescriptorEvent 事件)

public void postInsert(DescriptorEvent event) {

              AbstractEntity ae = (AbstractEntity) event.getObject();

              // inserting all the fields as seperate entry to audit table
              InsertObjectQuery query = (InsertObjectQuery) event.getQuery();
              AuditSession as = new AuditSession();

              as.setOperationType("I");
              as.setReason("test reason");


              long count=1;
              for (int i = 0; i < query.getModifyRow().getFields().size(); i++)
        {     
                     AuditTrail at = new AuditTrail();


                     DatabaseField dbField =(DatabaseField)query.getModifyRow().getFields().elementAt(i);
            if (dbField == null)
                continue;
            String fieldName = dbField.getName();

              if(query.getModifyRow().getValues(fieldName) != null){
                      at.setNewValue(query.getModifyRow().getValues(fieldName));
                }else{
                     at.setNewValue(null);
                }

            at.setFieldId(fieldName);
            at.setOldValue(null);

            if (ae.getClass().getAnnotation(Table.class) != null) {
                     at.setTableId(ae.getClass().getAnnotation(Table.class)
                                  .name());
              } else {
                     at.setTableId(ae.getClass().getSimpleName());
              }

            at.setOperationType("I");
            at.setSeqNo(count);
            at.setAppRecordId("1");
            as.addAuditTrail(at);
            count++;
         } 


         event.getSession().insertObject(as);

       }

在上述方法中,AuditSession 是具有 OneToMany 映射到 AuditTrail 实体的父实体

4

1 回答 1

0

所有插入、更新和删除查询默认为级联私有部分,因此除非您的 1:M 映射是私有的,否则不会插入引用的子对象。您可以根据需要使用 cascadeAllParts() 方法对查询进行更改:http: //www.eclipse.org/eclipselink/api/2.0/org/eclipse/persistence/queries/DatabaseQuery.html#cascadeAllParts()

于 2014-01-02T20:25:55.253 回答