我正在做一個使用 JPA 但沒有彈簧的作業。它具有服務層和存盤庫層。我嘗試在服務中開始事務并從存盤庫呼叫保存或更新,然后在服務中提交。但是如何在存盤庫中獲取 Current EntityManager 呢?我的鱈魚是這樣的:
服務:
public void save(Entity entity){
var em = factory.createEntityManager();
var t = em.getTransaction();
try {
t.begin();
repository1.save(entity);
// For saving one to many relation
repository2.save(entity.getChildEntity());
t.commit();
} catch (Exception e) {
t.rollback();
}
}
存盤庫:
// I don't want to pass EntityManager to method
public void save(T entity) {
var em = ? // How can I get EntityManager hear?
em.persist(entity);
}
uj5u.com熱心網友回復:
在您的服務的第一個片段中,我看到您有一個factory并在那里創建了一個EntityManager. 所以factory存在...
使用您的工廠,使其在您的程式中隨處可訪問。如何?創建一個特定于創建工廠和休眠會話的類。在那里,您可以為所需的欄位(例如factoryand EntityManager)創建公共靜態 getter。
例子:
public class HibernateUtils
{
public static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory()
{
try
{
// Create the SessionFactory from hibernate.cfg.xml
return new Configuration().configure().buildSessionFactory();
}
catch (Throwable ex)
{
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
}
}
uj5u.com熱心網友回復:
在 Spring 中,Services 和 Repositories 的使用是對 JPA 的進一步抽象。如果你想在沒有 Spring 的情況下使用 JPA,你可以使用標準的 JavaEE/JakartaEE 技術注入 EntityManager,這就是 Spring 在后臺所做的。
否則,如果您想自己做,請記住 JPA 是一個標準,有幾個實作。
讓我們考慮 Hibernate,去閱讀檔案,堅持使用 EntityManagerFactory 和 EntityManager 而不是 SessionManager(特定于 Hibernate)。
您可以將 EntityManager 實體化為:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my_PU");
EntityManager em = emf.createEntityManager();
“my_PU”是您需要定義的persistenceUnit。
更多資訊在這里:https ://docs.oracle.com/cd/E19798-01/821-1841/bnbrj/index.html#:~:text=A persistence unit defines a,the persistence.xml 配置 檔案。
uj5u.com熱心網友回復:
public class EntityManagerProvider {
private static final EntityManager entityManager;
public EntityManagerProvider() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.example.factory");
this.entityManager = emf.createEntityManager();
}
public static EntityManager getEntityManager() {
return entityManager;
}
}
第二種方法:
public class EntityManagerProvider {
private static final EntityManager entityManager;
private EntityManagerProvider() {}
public static synchronized EntityManager createOrGetEntityManager() {
if(entityManager == null) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.example.factory");
EntityManagerProvider.entityManager = emf.createEntityManager();
return EntityManagerProvider.entityManager;
}
return EntityManagerProvider.entityManager;
}
}
您需要創建一次 entityManager 并在任何地方使用它。我不知道您在哪里創建工廠類,但您可以在創建工廠類后創建 entityManagerProvider 類。
您可以簡單地呼叫 EntityManagerProvider.getEntityManager() 從類接收 entityManager。
請注意,您不需要在任何地方都進行初始化,您可以一次完成并在任何地方使用它。
SecondApproach 更好,您可以在任何地方簡單地使用它。EntityManagerProvider.createOrGetEntityManager 方法將為您提供 entityManager。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441649.html
