{"id":449,"date":"2009-06-07T13:20:10","date_gmt":"2009-06-07T05:20:10","guid":{"rendered":"https:\/\/lifeparty.idv.tw\/blog\/?p=449"},"modified":"2009-12-16T13:23:22","modified_gmt":"2009-12-16T05:23:22","slug":"%e9%99%8d%e4%bd%8e%e8%b3%87%e6%96%99%e5%ad%98%e5%8f%96%e7%9a%84%e9%87%8d%e8%a6%86%e6%80%a7","status":"publish","type":"post","link":"https:\/\/lifeparty.idv.tw\/blog\/archives\/449","title":{"rendered":"\u964d\u4f4e\u8cc7\u6599\u5b58\u53d6\u7684\u91cd\u8986\u6027"},"content":{"rendered":"<p>\u7a0b\u5f0f\u78bc\u7684\u91cd\u8986\u6027\u4f7f\u7a0b\u5f0f\u4e0d\u5bb9\u6613\u7dad\u8b77\u3001\u4ee5\u53ca\u589e\u52a0\u7cfb\u7d71\u51fa\u932f\u7684\u6a5f\u7387\uff0c\u540c\u6642\u4f7f\u5f97\u7a0b\u5f0f\u7684\u518d\u7528\u6027\u96e3\u4ee5\u63d0\u6607\u3002\u56e0\u6b64\u964d\u4f4e\u7a0b\u5f0f\u78bc\u7684\u91cd\u8986\u6027\u5c0d\u7a0b\u5f0f\u78bc\u7684\u54c1\u8cea\u8207\u5f48\u6027\u6709\u5f88\u5927\u7684\u52a9\u76ca\u3002\u7136\u800c\uff0c\u5728\u8cc7\u6599\u5b58\u53d6\u8207\u8207\u7269\u4ef6\u578b\u5225\u7684\u7121\u6cd5\u5206\u96e2\u7684\u60c5\u6cc1\u4e0b\uff0c\u537b\u6703\u4f7f\u5f97\u958b\u767c\u8005\u96e3\u4ee5\u5c0d\u6cbb\u7a0b\u5f0f\u78bc\u7684\u91cd\u8986\u6027\uff1b\u76f8\u540c\u8655\u7406\u8cc7\u6599\u7684\u908f\u8f2f\uff0c\u53d7\u9650\u65bc\u8655\u7406\u8cc7\u6599\u7684\u4e0d\u540c\u578b\u614b\uff0c\u4f7f\u5f97\u958b\u767c\u8005\u5fc5\u9808\u4f9d\u64da\u8cc7\u6599\u578b\u614b\u4e0d\u540c\uff0c\u800c\u6539\u5beb\u540c\u4e00\u6bb5\u7a0b\u5f0f\u78bc\uff0c\u4f7f\u5f97\u7a0b\u5f0f\u78bc\u5f88\u96e3\u5171\u7528\u3002<\/p>\n<p>\u5c31\u50cf\u4e00\u500b\u6bd4\u8f03\u5e38\u898b\u7684\u4f8b\u5b50\u662f\u8cc7\u6599\u6c38\u7e8c\u5b58\u53d6\u7684\u5be6\u4f5c\uff0c\u5e38\u6703\u56e0\u70ba\u5b58\u53d6\u8cc7\u6599\u578b\u614b\u7684\u4e0d\u540c\uff0c\u800c\u5f71\u97ff\u5230\u8cc7\u6599\u5b58\u53d6\u7684\u754c\u9762\uff0c\u56e0\u6b64\u5c0d\u6bcf\u4e00\u500b\u9700\u8981\u6301\u4e45\u5316\u7684\u5546\u696d\u9818\u57df\u7269\u4ef6\uff0c\u90fd\u5fc5\u9808\u91cd\u8986\u5730\u5be6\u4f5c\u5b83\u5011\u7684 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Create,_read,_update_and_delete\">CRUD<\/a> \u5b58\u53d6\u529f\u80fd\u3002<\/p>\n<p>\u96d6\u7136\u900f\u904e\u6c38\u7e8c\u5c64\u7684\u6982\u5ff5\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9019\u7a2e\u91cd\u8986\u6027\u9694\u96e2\u958b\u4f86\uff0c\u52a0\u4e0a\u6709\u4e9b <a href=\"http:\/\/en.wikipedia.org\/wiki\/Object-relational_mapping\">ORM<\/a> \u6c38\u7e8c\u6846\u67b6\u7684\u5354\u52a9\uff0c\u958b\u767c\u8cc7\u6599\u5b58\u53d6\u7269\u4ef6\u7684\u8ca0\u64d4\u4e26\u4e0d\u592a\u5927\u3002\u7136\u800c\u5373\u4f7f\u5982\u6b64\uff0c\u6211\u5011\u6709\u6c92\u6709\u53ef\u80fd\u907f\u514d\u91cd\u8986\u958b\u767c\u8cc7\u6599\u5b58\u53d6\u7684\u5143\u4ef6\uff0c\u4e0d\u7528\u91dd\u5c0d\u6bcf\u4e00\u7a2e\u7269\u4ef6\u578b\u5225\u90fd\u8981\u5beb\u4e00\u652f\u76f8\u5c0d\u7684\u8cc7\u6599\u5b58\u53d6\u7269\u4ef6\u5462\uff1f\u8981\u9054\u5230\u9019\u6a23\u7684\u76ee\u7684\uff0c\u6211\u5011\u5fc5\u9808\u5206\u96e2\u8cc7\u6599\u5b58\u53d6\u7684\u8655\u7406\u7a0b\u5e8f\u8207\u7269\u4ef6\u578b\u5225\uff0c\u4f46\u8981\u5982\u4f55\u624d\u80fd\u505a\u5230\u5462\uff1f<!--more--><\/p>\n<p>\u5047\u8a2d\u6211\u5011\u8981\u958b\u767c\u4e00\u500b\u6703\u54e1\u8a3b\u518a\u7684\u529f\u80fd\uff0c\u5982\u679c\u8003\u616e\u4ee5\u6e2c\u8a66\u4f86\u9a45\u52d5\u958b\u767c\u904e\u7a0b\uff0c\u6211\u5011\u53ef\u80fd\u6703\u5148\u64b0\u5beb\u4e0b\u9762\u7684\u6e2c\u8a66\u7a0b\u5f0f\uff1a<\/p>\n<pre class=\"brush: java\">\r\npublic class MemberTester \r\n    extends TestCase {\r\n    private static final String MEMBER_SERVICE = \r\n        \"memberSvc\";\r\n    private ApplicationContext context = null;\r\n\t\r\n    MemberTester() {\r\n\tcontext = new ClassPathXmlApplicationContext(\r\n            \"conf\/appContext.xml\");\r\n    }\r\n\t\r\n    void testRegisterMember() {\r\n        MemberService memberSvc = (MemberService) \r\n            context.getBean(MEMBER_SERVICE);\r\n        User member = new User();\r\n\r\n        member.setId(\"myId\");\r\n        member.setEncodedPassword(\"abc\");\r\n        member.setEmailAddress(\"myId@domain\");\r\n\t\t\r\n        memberSvc.RegisterMember(member);\r\n\r\n        CriteriaExpression criteria = \r\n            Comparison.eq(\"id\", \r\n            ConstantExpression.getString(\"myId\"));\r\n        ParameterContext parameterContext = \r\n            new HashtableParameterContext();\r\n        User members[] = \r\n            memberSvc.getMembers(criteria, \r\n            parameterContext, 0);\r\n\t\t\r\n        assertEquals(members.size(), 1);\r\n\t\t\r\n        for (int i = 0; i < members.length(); \r\n            i ++) {\r\n            assertEquals(member.getId(), \r\n                members[i].getId());\r\n            assertEquals(\r\n                member.getEncodedPassword(), \r\n                members[i].getEncodedPassword());\r\n            assertEquals(\r\n                member.getEmailAddress(), \r\n                members[i].getEmailAddress());\r\n        }\r\n\r\n        memberSvc.removeMember(member);\r\n    }\r\n}\r\n<\/pre>\n<p>\u5f9e\u6e2c\u8a66\u7a0b\u5f0f\u627e\u5230\u61c9\u7528\u670d\u52d9\u7684\u754c\u9762 <em>MemberService<\/em> \uff0c\u4e26\u9032\u4e00\u6b65\u5be6\u73fe\u7b26\u5408\u6b64\u754c\u9762\u7684\u670d\u52d9\u5143\u4ef6\uff1a<\/p>\n<pre class=\"brush: java\">\r\npublic interface MemberService {\r\n    public User [] GetMembers(\r\n        CriteriaExpression criteria, \r\n        ParameterContext context, int maxCount);\r\n    public void RegisterMember(User member);\r\n    public void UpdateMemberInfo(User member);\r\n    public void removeMember(User member);\r\n}\r\n<\/pre>\n<pre class=\"brush: java\">\r\npublic class MemberServiceImpl \r\n    implements MemberService {\r\n    private UserDataAccessor \r\n        memberDataAccessor = null;\r\n\t\r\n    public User [] GetMembers(\r\n        CriteriaExpression criteria, \r\n        ParameterContext context, \r\n        int maxCount) {\r\n        return memberDataAccessor.find(criteria, \r\n            context, maxCount);\r\n    }\r\n\r\n    public void RegisterMember(User member) {\r\n        memberDataAccessor.insert(member);\r\n    }\r\n\r\n    public void UpdateMemberInfo(User member) {\r\n        memberDataAccessor.update(member, \r\n            LockMode.UPGRADE);\r\n    }\r\n\r\n    public void removeMember(User member) {\r\n        memberDataAccessor.remove(member, \r\n            LockMode.UPGRADE);\r\n    }\r\n\r\n    public void setMemberDataAccessor(\r\n        UserDataAccessor memberDataAccessor) {\r\n        this.memberDataAccessor = \r\n            memberDataAccessor;\r\n    }\r\n\r\n    public UserDataAccessor \r\n        getMemberDataAccessor() {\r\n        return memberDataAccessor;\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u5be6\u4f5c\u670d\u52d9\u5143\u4ef6\u6703\u4f7f\u7528\u5230\u754c\u9762 <em>UserDataAccessor<\/em> \u4f86\u5b58\u53d6\u6703\u54e1\u8cc7\u6599\uff0c\u5229\u7528\u6c38\u7e8c\u6846\u67b6\u5982 <a href=\"http:\/\/www.hibernate.org\/\">Hibernate<\/a>\uff0c\u53ef\u4ee5\u6e1b\u8f15\u6211\u5011\u958b\u767c\u8cc7\u6599\u5b58\u53d6\u529f\u80fd\u7684\u5be6\u4f5c\u8ca0\u64d4\u3002<\/p>\n<pre class=\"brush: java\">\r\npublic UserDataAccessor {\r\n    public void insert(User obj);\r\n    public void update(User obj);\r\n    public BizObject get(Serializable id);\r\n    public void remove(User obj);\r\n    User [] find(CriteriaExpression criteria, \r\n        ParameterContext context, \r\n        int maxCount);\r\n}\r\n<\/pre>\n<pre class=\"brush: java\">\r\npublic class UserDataAccessorImpl \r\n    implements UserDataAccessor \r\n    extends HibernateDataAccessor {\r\n\r\n    public UserDataAccessorImpl() {\r\n        super();\r\n    }\r\n\r\n    public void insert(User user) {\r\n        insertBizObj(user);\r\n    }\r\n\r\n    public User get(Serializable id) {\r\n        return (User) getBizObj(id);\r\n    }\r\n\r\n    public void update(User user) {\r\n    \tupdateBizObj(user);\r\n    }\r\n\r\n    public void remove(User user) {\r\n        removeBizObject(user);\r\n    }\r\n\r\n    public User [] find(\r\n        CriteriaExpression criteria, \r\n        ParameterContext context, \r\n        int maxCount) {\r\n        List userList = findBizObjs(criteria, \r\n            context, maxCount);\r\n        User users[] = new User[userList.size()];\r\n        \r\n        for (int i = 0; i < userList.size(); \r\n            i ++) {\r\n            users[i] = userList.get(i);\r\n        }\r\n\r\n        return users;\r\n    }\r\n}\r\n<\/pre>\n<p>\u4ee5\u4e0a\u7684\u7a0b\u5f0f\u662f\u5047\u8a2d\u6211\u5011\u5df2\u7d93\u958b\u767c\u597d\u4f9b\u8cc7\u6599\u5b58\u53d6\u7269\u4ef6\u7e7c\u627f\u7684 <em>HibernateDataAccessor<\/em> \u7684\u57fa\u790e\u985e\u5225\u3002\u5b83\u88ab\u5b9a\u7fa9\u70ba abstract class\uff0c\u53ea\u63d0\u4f9b protected methods \u4f9b\u884d\u751f\u985e\u5225\u547c\u53eb\u7269\u4ef6\u5b58\u53d6\u7684\u529f\u80fd\uff0c\u4f8b\u5982\u4e0a\u9762\u7a0b\u5f0f\u7247\u6bb5\u7684 <em>insertBizObj<\/em>\u3001<em>updateBizObj<\/em>\u3001<em>getBizObj<\/em>\u3001<em>removeBizObj<\/em>\u3001\u4ee5\u53ca <em>findBizObjs<\/em> \u7b49\u65b9\u6cd5\u3002\u9019\u6a23\u4f7f\u5f97\u6c38\u7e8c\u5b58\u53d6\u7269\u4ef6\u7684\u5be6\u4f5c\u8ca0\u64d4\u4e26\u4e0d\u91cd\uff0c\u4f46\u7f8e\u4e2d\u4e0d\u8db3\u7684\u662f\u4ecd\u7136\u56e0\u61c9\u4e0d\u540c\u7684\u7269\u4ef6\u958b\u767c\u4ed6\u5011\u6240\u9700\u8981\u7684\u6c38\u7e8c\u5b58\u53d6\u7269\u4ef6\uff0c\u800c\u5404\u500b\u6c38\u7e8c\u5b58\u53d6\u7269\u4ef6\u4e4b\u9593\u6700\u5927\u7684\u5dee\u7570\u537b\u53ea\u662f\u4e0d\u540c\u7269\u4ef6\u7684\u8f49\u578b\u800c\u5df2\uff0c\u800c\u986f\u5f97\u6709\u4e9b\u91cd\u8986\u800c\u7b28\u62d9\u3002<\/p>\n<p>\u6240\u5e78 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Java_(programming_language)\">Java<\/a> 5.0 \u4ee5\u5f8c\u63d0\u4f9b\u7684<a href=\"http:\/\/en.wikipedia.org\/wiki\/Generic_programming\">\u6cdb\u578b\u7a0b\u5f0f\u8a2d\u8a08<\/a>\uff0c\u53ef\u4ee5\u5e6b\u6211\u5011\u53c3\u6578\u5316\u5b58\u53d6\u7269\u4ef6\u7684\u578b\u614b\uff0c\u9019\u6a23\u5c31\u53ef\u8b93\u8cc7\u6599\u5b58\u53d6\u7684\u8655\u7406\u7a0b\u5e8f\uff0c\u8207\u8cc7\u6599\u5f62\u614b\u5b8c\u5168\u5206\u96e2\u3002\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u8a2d\u8a08\u9069\u7528\u5b58\u53d6\u5404\u7a2e\u8cc7\u6599\u578b\u614b\u7684\u6cdb\u578b\u8cc7\u6599\u5b58\u53d6\u754c\u9762\u5982\u4e0b\u3002<\/p>\n<pre class=\"brush: java\">\r\npublic interface DataAccessor&lt;BizObject, \r\n    LockType&gt; \r\n    extends Persister&lt;BizObject, \r\n    LockType&gt;, \r\n    FinderExecutor&lt;BizObject&gt; {\r\n}\r\n\r\npublic interface Persister&lt;BizObject, \r\n    LockType&gt; {\r\n    public void insert(BizObject obj);\r\n    public void update(BizObject obj, \r\n        LockType lock);\r\n    public BizObject get(Serializable id, \r\n        LockType lock);\r\n    public void remove(BizObject obj, \r\n        LockType lock);\r\n}\r\n\r\npublic interface FinderExecutor&lt;BizObject&gt; {\r\n    List&lt;BizObject&gt; find(\r\n        CriteriaExpression criteria, \r\n        ParameterContext context, int maxCount);\r\n    void addFilter(String name, Map&lt;String, \r\n        Object&gt; params);\r\n    void removeFilter(String name);\r\n}\r\n<\/pre>\n<p>\u70ba\u4e86\u8b93\u8cc7\u6599\u5b58\u53d6\u7684\u6b0a\u8cac\u66f4\u6e05\u695a\u800c\u660e\u78ba\uff0c\u6211\u5011\u4f7f <em>DataAccessor<\/em> \u7d44\u5408\u5169\u7a2e\u62bd\u8c61\u6982\u5ff5\uff0c\u4e00\u500b\u662f\u6c38\u7e8c\u7269\u4ef6\u7684\u5b58\u53d6\u3001\u53e6\u4e00\u500b\u5247\u662f\u627e\u51fa\u7b26\u5408\u67e5\u8a62\u689d\u4ef6\u7684\u6c38\u7e8c\u7269\u4ef6\u5e8f\u5217\u3002\u4f9d\u64da <a href=\"http:\/\/en.wikipedia.org\/wiki\/OOAD\">OOAD<\/a> \u7684 <a href=\"http:\/\/www.objectmentor.com\/resources\/articles\/isp.pdf\">ISP<\/a> \u539f\u5247\uff0c\u5c07\u9019\u5169\u7a2e\u4e0d\u540c\u6982\u5ff5\u5206\u96e2\u6210\u5169\u500b\u754c\u9762\uff0c\u4e26\u7531\u5be6\u4f5c <em>DataAccessor<\/em> \u754c\u9762\u7684\u7a0b\u5f0f\u4f86\u5206\u5225\u5be6\u4f5c\u9019\u5169\u500b\u754c\u9762\u3002<\/p>\n<pre class=\"brush: java\">\r\npublic class HibernateDataAccessor&lt;\r\n    BizObject&gt; implements \r\n    DataAccessor&lt;BizObject, LockMode&gt; {\r\n\r\n    private Class&lt;BizObject&gt; bizObjType;\r\n    private SessionFactory sessionFactory = null;\r\n    private HibernateTemplate hibernateTemplate \r\n        = null;\r\n    \r\n    public static int MAX_COUNT_IS_NOT_LIMITED \r\n        = 0;\r\n    \r\n    public HibernateDataAccessor(\r\n        Class&lt;BizObject&gt; bizObjType) {\r\n        super();\r\n        this.bizObjType = bizObjType;\r\n    }\r\n\r\n    public void insert(BizObject obj) {\r\n        if (hibernateTemplate != null) {\r\n            hibernateTemplate.save(obj);\r\n            hibernateTemplate.flush();   \t\t\r\n        }\r\n    }\r\n\r\n    public BizObject get(Serializable id, \r\n        LockMode lock) {\r\n    \tBizObject bizObj = null;\r\n\r\n        if (id != null && \r\n            hibernateTemplate != null) {\r\n            hibernateTemplate.flush();\r\n            hibernateTemplate.get(bizObjType, id, \r\n                lock);\r\n        }\r\n\r\n        return bizObj;\r\n    }\r\n\r\n    public void update(BizObject obj, \r\n        LockMode lock) {\r\n        if (hibernateTemplate != null) {\t\r\n            hibernateTemplate.update(obj, lock);\r\n            hibernateTemplate.flush();\r\n        }\r\n    }\r\n\r\n    public void remove(BizObject obj, \r\n        LockMode lock) {\r\n        if (hibernateTemplate != null) {\r\n            hibernateTemplate.delete(obj, lock);\r\n            hibernateTemplate.flush();\r\n        }\r\n    }\r\n\r\n    public void setSessionFactory(\r\n        SessionFactory sessionFactory) {\r\n        this.sessionFactory = sessionFactory;\r\n        this.hibernateTemplate = \r\n            new HibernateTemplate(\r\n                this.sessionFactory);\r\n    }\r\n\r\n    public SessionFactory getSessionFactory() {\r\n        return sessionFactory;\r\n    }\r\n\r\n    public List&lt;BizObject&gt; find(\r\n        CriteriaExpression criteria, \r\n        ParameterContext context, int maxCount) {\r\n        \r\n        if (hibernateTemplate != null)\t{\r\n            QueryCriteria fromBizObject = \r\n                QueryCriteria.from(bizObjType);\r\n            HibernateHqlQueryBuilder builder = \r\n                getHqlBuilder(\r\n                fromBizObject.where(criteria, \r\n                context));\r\n\t\r\n            hibernateTemplate.flush();\r\n            hibernateTemplate.setMaxResults(\r\n                maxCount);\r\n\t\r\n            if (builder.getParamValues().length \r\n                > 0) {\r\n                return hibernateTemplate.find(\r\n                    builder.getHqlText(), \r\n                    builder.getParamValues());\r\n            } else {\r\n                return hibernateTemplate.find(\r\n                    builder.getHqlText());\r\n            }\r\n        }\r\n        else {\r\n            return null;\r\n        }\r\n    }\r\n\t\r\n    private HibernateHqlQueryBuilder \r\n        getHqlBuilder(\r\n        QueryCriteria criteria) {\r\n        HibernateHqlQueryBuilder builder = \r\n            new HibernateHqlQueryBuilder();\r\n        CriteriaQueryDirector director = \r\n            new CriteriaQueryDirector(builder);\r\n\r\n        director.makeQuery(criteria, \r\n            criteria.getContext());\r\n\r\n        return builder;\r\n    }\r\n\r\n    public void addFilter(String name, Map&lt;String, \r\n        Object&gt; params) {\r\n        if (hibernateTemplate != null)\r\n        {\r\n            Filter filter = \r\n                hibernateTemplate.enableFilter(\r\n                name);\r\n            Iterator&lt;\r\n                Map.Entry&lt;String, \r\n                Object&gt; &gt; it \r\n                    = params.entrySet().iterator();\r\n\t    \r\n            while(it.hasNext())\r\n            {\r\n                Map.Entry&lt;String, Object&gt; mapEntry \r\n                    = it.next();\r\n                filter.setParameter(\r\n                    mapEntry.getKey(), \r\n                    mapEntry.getValue());\r\n            }\r\n        }\r\n    }\r\n\r\n    public void removeFilter(String name) {\r\n        if (hibernateTemplate != null) {\r\n            final String filterName = name; \r\n\t\t\t\r\n            hibernateTemplate.execute(\r\n                new HibernateCallback() {\r\n                public Object doInHibernate(\r\n                    Session session)\r\n                    throws HibernateException, \r\n                    SQLException {\r\n                        session.disableFilter(\r\n                            filterName);\r\n\t\t\t\t\t\r\n                        return null;\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\u4e0a\u9762\u9019\u6bb5\u7a0b\u5f0f\u7528\u5230\u540c\u4eba\u904e\u53bb\u5206\u4eab\u7684\u300c<a href=\"https:\/\/lifeparty.idv.tw\/blog\/archives\/192\">\u6c38\u7e8c\u7269\u4ef6\u67e5\u8a62\u7684\u8a2d\u8a08<\/a>\u300d\u4f86\u4e00\u822c\u5316\u67e5\u8a62\u5546\u696d\u7269\u4ef6\u7684\u65b9\u6cd5\uff0c\u8b93\u6211\u5011\u4e0d\u6703\u53d7\u5230 ORM \u7684\u6846\u67b6\u800c\u5f71\u97ff\u5f71\u97ff DataAccossor \u7684\u64cd\u4f5c\u754c\u9762\u3002\u540c\u4eba\u5efa\u7acb\u4e00\u500b\u5171\u901a\u7684\u8868\u8ff0\u8a9e\u6cd5\u7a31\u70ba QueryExpression\uff0c\u8b93\u67e5\u8a62\u5546\u696d\u7269\u4ef6\u7684\u5be6\u4f5c\u65b9\u5f0f\u4e0d\u6703\u56e0\u70ba\u6c38\u7e8c\u6846\u67b6\u7684\u6539\u8b8a\u800c\u53d7\u5230\u5f71\u97ff\u3002<\/p>\n<p>\u518d\u52a0\u4e0a BizObject \u8207 LockMode \u578b\u614b\u7684\u53c3\u6578\u5316\uff0c\u4f7f\u6211\u5011\u4e0d\u9700\u8981\u70ba\u4e0d\u540c\u7684\u7269\u4ef6\u578b\u614b\u6216\u6c38\u7e8c\u6846\u67b6\u7684\u9396\u5b9a\u6a5f\u5236\u800c\u91cd\u8986\u958b\u767c\u8cc7\u6599\u5b58\u53d6\u5143\u4ef6\u3002\u6b64\u5916\uff0c\u8003\u616e\u7269\u4ef6\u53ef\u80fd\u6703\u6709\u9700\u8981\u4e8b\u5148\u5b9a\u7fa9\u904e\u6ffe\u689d\u4ef6\u7684\u9700\u6c42\uff0c\u6211\u5011\u4e5f\u5728 <em>FinderExecutor<\/em> \u754c\u9762\u4e2d\u52a0\u5165\u4e86 <em>AddFilter()<\/em> \u53ca <em>RemoveFilter()<\/em> \u7684\u64cd\u4f5c\u754c\u9762\u3002\u4f7f\u7528 Hibernate \u7684\u6cdb\u578b\u8cc7\u6599\u5b58\u53d6\u5143\u4ef6\uff0c\u53ea\u9808\u7565\u70ba\u4fee\u6539\u6211\u5011\u7684\u6703\u54e1\u670d\u52d9\u7684\u5be6\u4f5c\uff0c\u6211\u5011\u6839\u672c\u7121\u9808\u984d\u5916\u958b\u767c\u6703\u54e1\u8cc7\u6599\u7684\u8cc7\u6599\u5b58\u53d6\u7269\u4ef6\u3002<\/p>\n<pre class=\"brush: java\">\r\npublic class MemberServiceImpl \r\n    implements MemberService {\r\n\r\n    private DataAccessor&lt;User, \r\n        LockMode&gt; memberDataAccessor \r\n            = null;\r\n\t\r\n    public List&lt;User&gt; getMembers(\r\n        CriteriaExpression criteria, \r\n        ParameterContext context, \r\n        int maxCount) {\r\n            return memberDataAccessor.find(\r\n                criteria, context, maxCount);\r\n\t}\r\n\r\n    public void registerMember(\r\n        User member) {\r\n        memberDataAccessor.insert(\r\n            member);\r\n    }\r\n\r\n    public void updateMemberInfo(\r\n        User member) {\r\n        memberDataAccessor.update(\r\n            member, LockMode.UPGRADE);\r\n    }\r\n\r\n    public void setMemberDataAccessor(\r\n        DataAccessor&lt;User, LockMode&gt; \r\n        memberDataAccessor) {\r\n        this.memberDataAccessor \r\n            = memberDataAccessor;\r\n\t}\r\n\r\n    public DataAccessor&lt;User, LockMode&gt; \r\n        getMemberDataAccessor() {\r\n        return memberDataAccessor;\r\n    }\r\n\r\n    public void removeMember(User member) {\r\n        memberDataAccessor.remove(\r\n            member, LockMode.UPGRADE);\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u6211\u5011\u53ea\u9808\u5728\u6ce8\u5165 memberDataAccessor \u6642\uff0c\u4ee5 User \u7684\u8cc7\u6599\u578b\u614b\u50b3\u5165\u5efa\u69cb\u5b50\u7684\u53c3\u6578\u521d\u59cb\u5316\u8cc7\u6599\u5b58\u53d6\u7269\u4ef6\uff0c\u5c31\u4e0d\u9700\u8981\u518d\u70ba User \u958b\u767c\u8cc7\u6599\u5b58\u53d6\u7269\u4ef6\u4e86\uff0c\u56e0\u70ba\u8cc7\u6599\u5b58\u53d6\u7684\u8655\u7406\u908f\u8f2f\u8207\u8cc7\u6599\u578b\u614b\u5df2\u7d93\u5206\u96e2\uff0c\u5f7c\u6b64\u4e0d\u518d\u76f8\u4e92\u8026\u5408\uff0c\u9019\u6b63\u662f\u6cdb\u578b\u6280\u8853\u5e36\u7d66\u6211\u5011\u7684\u4e00\u5927\u512a\u52e2\u5440\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7a0b\u5f0f\u78bc\u7684\u91cd\u8986\u6027\u4f7f\u7a0b\u5f0f\u4e0d\u5bb9\u6613\u7dad\u8b77\u3001\u4ee5\u53ca\u589e\u52a0\u7cfb\u7d71\u51fa\u932f\u7684\u6a5f\u7387\uff0c\u540c\u6642\u4f7f\u5f97\u7a0b\u5f0f\u7684\u518d\u7528\u6027\u96e3\u4ee5 &hellip; <a href=\"https:\/\/lifeparty.idv.tw\/blog\/archives\/449\">\u95b1\u8b80\u5168\u6587 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29,24,49,37,19],"tags":[],"class_list":["post-449","post","type-post","status-publish","format-standard","hentry","category-29","category-24","category-49","category-37","category-19"],"_links":{"self":[{"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/posts\/449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/comments?post=449"}],"version-history":[{"count":155,"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/posts\/449\/revisions"}],"predecessor-version":[{"id":2447,"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/posts\/449\/revisions\/2447"}],"wp:attachment":[{"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/media?parent=449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/categories?post=449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lifeparty.idv.tw\/blog\/wp-json\/wp\/v2\/tags?post=449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}