用 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 :)
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 :)