关于hibernate:JPA EntityManager,它是如何工作的?

 2021-04-26 

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()。


希望这张照片能回答您的问题。
enter

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
}

} ??