用 db.command 触发钩子

Trigger Hook with db.command

  public class Hooks {

     public static void main(String[] args) {
        ODatabaseDocument db = new ODatabaseDocumentTx("remote:localhost/New");
        MyHook hook = new MyHook();

        try {
           db.open("admin", "admin");
           db.registerHook(hook);
           db.command(new OCommandSQL("create class Account")).execute();

           db.getMetadata().getSchema().reload();

           ODocument accountR = new ODocument("Account");
           accountR.field("type", "facebook");
           accountR.save();

           db.command(new OCommandSQL("insert into Account set type = 'twitter'")).execute();

        } finally {
           db.unregisterHook(hook);
           db.close();
        }
     }

     private static class MyHook extends ODocumentHookAbstract {

        public MyHook() {
           setIncludeClasses("Account");
        }

        @Override
        public ORecordHook.DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
           return ORecordHook.DISTRIBUTED_EXECUTION_MODE.SOURCE_NODE;
        }

        @Override
        public ORecordHook.RESULT onRecordBeforeCreate(ODocument iDocument) {
           System.out.println("before create : " + iDocument.field("type"));
           return ORecordHook.RESULT.RECORD_NOT_CHANGED;
        }
     }
  }

输出为:

before create : facebook

这意味着挂钩仅在 doc.save() 中触发。

有没有办法用 db.command(...) 触发它?

(我在尝试删除时遇到了同样的问题。只有doc.delete()会触发钩子)

谢谢

服务器执行OCommandSQL命令。如果您使用 plocal 连接,您将看到它按预期工作。 要在服务器端执行 (java) 钩子,它必须在那里注册,参见 documentation. Also note you can use Dynamic Hooks.

顺便说一句,欢迎来到 Whosebug :)