{"id":41865249,"url":"https://github.com/tomitribe/hodao","last_synced_at":"2026-01-25T11:39:50.764Z","repository":{"id":22158060,"uuid":"25489510","full_name":"tomitribe/hodao","owner":"tomitribe","description":"ssh connectors","archived":false,"fork":false,"pushed_at":"2023-07-28T10:06:04.000Z","size":45,"stargazers_count":2,"open_issues_count":1,"forks_count":4,"subscribers_count":18,"default_branch":"master","last_synced_at":"2026-01-14T04:35:10.946Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomitribe.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2014-10-20T22:26:38.000Z","updated_at":"2023-07-28T16:38:28.000Z","dependencies_parsed_at":"2022-08-19T18:10:42.891Z","dependency_job_id":null,"html_url":"https://github.com/tomitribe/hodao","commit_stats":null,"previous_names":["tomitribe/dry-crud"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/tomitribe/hodao","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fhodao","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fhodao/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fhodao/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fhodao/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomitribe","download_url":"https://codeload.github.com/tomitribe/hodao/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomitribe%2Fhodao/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28752668,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T10:25:12.305Z","status":"ssl_error","status_checked_at":"2026-01-25T10:25:11.933Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-25T11:39:49.990Z","updated_at":"2026-01-25T11:39:50.759Z","avatar_url":"https://github.com/tomitribe.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Hodao\n:showtitle:\n\nHelper library for DAOs.  Inspired by the great Hodor himself.  Boilerplate persistence code tends to be like him\n-- simple and repetitive.\n\nHodor hodor hodor persist. Hodor hodor hodor merge.  Hodor hodor hodor delete.  Hodor HODOR!\n\nHodao takes advantage of Apache TomEE's abstract-bean concept.  The DAO is declared abstract and boilerplate methods\ncan be simply annotated and handled by the framework.  Unlike purely interface-based approaches, this still allows\nyou to use plain Java code for persistence logic that falls outside what the framework handles.\n\nThe guts of the \"framework\" are https://github.com/tomitribe/hodao/blob/master/src/main/java/org/tomitribe/hodao/impl/PersistenceHandler.java[less than 500 lines of code].\nThe rest is pure annotations. *Copy/paste reuse encouraged, forks encouraged, _change it to fit you_!*\n\nRequires Apache TomEE 1.5.x or newer.\n\n== Usage\n\nTo use, simply declare your EJB as abstract and implement _java.lang.reflect.InvocationHandler_ as follows.\n\n[source,java]\n----\nimport org.tomitribe.hodao.impl.PersistenceHandler;\nimport javax.ejb.Stateless;\nimport javax.persistence.EntityManager;\nimport javax.persistence.PersistenceContext;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\n\n@Stateless\npublic abstract class BookCrud implements InvocationHandler {\n\n    @PersistenceContext\n    private EntityManager em;\n\n    //...\n\n    @Override\n    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {\n        return PersistenceHandler.invoke(this.em, method, args);\n    }\n}\n----\n\nFrom here you can leverage the following annotations to abstract out common _javax.persistence.EntityManager_ boilerplate.\n\n- org.tomitribe.hodao.Find\n- org.tomitribe.hodao.Merge\n- org.tomitribe.hodao.Persist\n- org.tomitribe.hodao.Remove\n- org.tomitribe.hodao.NamedQuery\n- org.tomitribe.hodao.QueryString\n\nAll of which map to their simple JPA _EntityManager_ equivalent.\n\n=== Simple example\n\n[source,java]\n----\nimport org.tomitribe.hodao.Find;\nimport org.tomitribe.hodao.MaxResults;\nimport org.tomitribe.hodao.Merge;\nimport org.tomitribe.hodao.NamedQuery;\nimport org.tomitribe.hodao.Offset;\nimport org.tomitribe.hodao.Optional;\nimport org.tomitribe.hodao.Persist;\nimport org.tomitribe.hodao.QueryParam;\nimport org.tomitribe.hodao.impl.PersistenceHandler;\n\nimport javax.ejb.Lock;\nimport javax.ejb.LockType;\nimport javax.ejb.Singleton;\nimport javax.persistence.EntityManager;\nimport javax.persistence.PersistenceContext;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\nimport java.util.List;\n\n@Singleton\n@Lock(LockType.READ)\npublic abstract class BookDao implements InvocationHandler {\n\n    @PersistenceContext\n    private EntityManager em;\n\n    @Persist\n    public abstract Book create(final Book book);\n\n    @Merge\n    public abstract Book update(final Book book);\n\n    @Find\n    public abstract Book find(Long id);\n\n    @NamedQuery(Book.FIND_BY_TITLE)\n    @Optional\n    public abstract List\u003cBook\u003e findBooksByTitle(@QueryParam(\"title\") final String title);\n\n    @NamedQuery(Book.FIND_ALL)\n    @Optional\n    public abstract List\u003cBook\u003e findAll(@Offset final Integer offset, @MaxResults final Integer max);\n\n    @Override\n    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {\n        return PersistenceHandler.invoke(this.em, method, args);\n    }\n}\n----\n\n=== @Persist for _EntityManager.persist_\n\nValid examples of _@Persist_ include:\n\n[source,java]\n----\n    @Persist\n    public abstract Book create(final Book book);\n\n    @Persist\n    public abstract void anotherAwesomeMovie(final Movie movie);\n----\n\n\n=== @Merge for _EntityManager.merge_\n\nValid examples of _@Merge_ include:\n\n[source,java]\n----\n    @Merge\n    public abstract Book update(final Book book);\n\n    @Merge\n    public abstract Color update(final Color color);\n----\n\n=== @Find for _EntityManager.find_\n\nValid examples of _@Find_ include:\n\n[source,java]\n----\n    @Find\n    public abstract Book find(final Long bookId);\n\n    @Find\n    public abstract Author whoIsThis(final long authorId);\n\n    @Find\n    public abstract Cover giveMe(final int coverId);\n\n    @Find\n    public abstract Color lookFor(final ColorID customPrimaryKey);\n----\n\n=== @Remove for _EntityManager.remove_\n\nValid examples of _@Remove_ include:\n\n[source,java]\n----\n    @Remove\n    public abstract void delete(final Book book);\n\n    @Remove\n    public abstract void rottenTomatoes(final Movie movie);\n----\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomitribe%2Fhodao","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomitribe%2Fhodao","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomitribe%2Fhodao/lists"}