JPA EntityManager, how does it work?
抱歉,这个菜鸟有问题,但是我在使用JPA Hibernate时遇到了问题,因此我认为尚不清楚。
我有一些实体,比如说A,B,C,D,我已经编码了AMethods,BMethods,CMethods,DMethods。每个* Methods类都包含通过EntityManagerFactory进行的EntityManager初始化以及一些基本执行查询的方法。我不知道我是否应该使用单例模式(以便每个* Method类拥有一个EntityManager),还是我每次执行查询时需要打开和关闭EntityManager还是坚持/删除一个实体...你能帮我吗?
在典型的JPA / Hibernate应用程序中,您不会在实体类本身中放置持久性逻辑。与较早的EJB 2.x应用程序相比,这是设计理念的重大变化。取而代之的是,许多应用程序创建了一层与实体分开的数据访问对象,这些实体使用EntityManager实例来查询,加载和保存实体。通常,这些是单例,并且DAO中的实体管理器实例是线程本地的。
如果使用Spring之类的框架,则EntityManager实例和事务的管理是完全自动的。与EJB 3相同,尽管我没有在大型项目中使用它。我建议阅读Spring文档中有关对象关系映射数据访问的章节。即使您最终没有在应用程序中使用Spring,本章也提供了一些有关如何以分层方式构造应用程序(将持久性关注点与要持久化的实体分开)的良好提示。祝你好运!
EntityManager与持久性上下文关联。如果您所有的实体都与一个上下文相关联,请使用单例模式。
您在服务器端使用jpa,对吗?如果是这样,则可以在init方法中初始化EntityManager,例如servlet上的init()。
希望这张照片能回答您的问题。
就是这样!
公共接口ProtokollDAOService {
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /** * Fügt ein Protokollobjekt in die Datenbank hinzu. * * @param object */ public void addProtokoll (ProtokollModel object); /** * L?d aus einer Datenbank Protokoll-Elemente und fügt sie in eine Liste hinzu * * @return List <ProtokollModel> Liste mit Protokoll-Elementen */ public List <ProtokollModel> getProtokolls (); /** * Liefert ein Protokoll-Element aus der Datenbank anhand der ID; * * @param id * @return ProtokollModel Protokoll-Element */ public ProtokollModel getProtokollById (long id); /** * Liefert eine Liste von Protokoll-Elementen anhand des Problem-Status * * @param solved * @return List <ProtokollModel> Liste mit Protokoll-Elementen */ public List <ProtokollModel> getProtokollByProblemStatus (boolean solved); /** * Liefert eine Liste von Protokoll-Elementen anhand des Aufgaben-Status * * @param ready * @return List <ProtokollModel> Liste mit Protokoll-Elementen */ public List <ProtokollModel> getProtokollByAufgabenStatus (boolean ready); /** * Liefert ein Protokoll-Element anhand des Problems * * @param problem * @return List <ProtokollModel> Liste mit Protokoll-Elementen */ public List <ProtokollModel> getProtokollByProblem (String problem); /** * Liefert ein Protokoll-Element anhand der Aufgabe * * @param aufgabe * @return List <ProtokollModel> Liste mit Protokoll-Elementen */ public List <ProtokollModel> getProtokollByAufgabe (String aufgabe); /** * Ausgabe der Protokoll-Tabelle * */ public void printTable (); |
} ??
公共类ProtokollDAOImpl实现ProtokollDAOService {
私有静态最终字符串PERSISTENCE_UNIT_NAME =" ProtokollManager";
私有EntityManagerFactory实体工厂;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | /* * (non-Javadoc) * * @see util.ProtokollDAOService#addProtokoll(model.ProtokollModel) */ public void addProtokoll(ProtokollModel object) { try { entityFactory = Persistence .createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = entityFactory.createEntityManager(); // Transaction starten em.getTransaction().begin(); // Object zum speichern em.persist(object); // commit senden an die DB / Transaction abschliessen em.getTransaction().commit(); // DB connection schliessen em.close(); } catch (Exception e) { Logger.console("Exception wurde ausgel?sst!" + e); e.printStackTrace(); } } /* * (non-Javadoc) * * @see util.ProtokollDAOService#getProtokollByAufgabe(java.lang.String) */ public List<ProtokollModel> getProtokollByAufgabe(String aufgabe) { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see util.ProtokollDAOService#getProtokollByAufgabenStatus(boolean) */ public List<ProtokollModel> getProtokollByAufgabenStatus(boolean ready) { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see util.ProtokollDAOService#getProtokollById(long) */ public ProtokollModel getProtokollById(long id) { try { entityFactory = Persistence .createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = entityFactory.createEntityManager(); // Transaction starten em.getTransaction().begin(); // Object aus der DB laden Query q = em.createQuery("select m from ProtokollModel m where m.id=:id"); // Parameter setzen - siehe PreparedStatment q.setParameter("id", id); // liefert das Protokoll-Element zurück ProtokollModel pm = (ProtokollModel) q.getSingleResult(); // commit senden an die DB / Transaction abschliessen em.getTransaction().commit(); // db connection schliessen em.close(); return pm; } catch (Exception e) { Logger.console("Exception wurde ausgel?sst!" + e); e.printStackTrace(); } finally { } return null; } /* * (non-Javadoc) * * @see util.ProtokollDAOService#getProtokollByProblem(java.lang.String) */ public List<ProtokollModel> getProtokollByProblem(String problem) { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see util.ProtokollDAOService#getProtokollByProblemStatus(boolean) */ public List<ProtokollModel> getProtokollByProblemStatus(boolean solved) { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see util.ProtokollDAOService#getProtokolls() */ public List<ProtokollModel> getProtokolls() { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see util.ProtokollDAOService#printTable() */ public void printTable() { // TODO Auto-generated method stub } |
} ??