簡體   English   中英

EntityManager 和 createEntityManagerFactory 與 application.properties

[英]EntityManager and createEntityManagerFactory with application.properties

我必須使用 DAO 類創建 singleton 類。

以下是讀取 class 的 DAO 示例:

package com.luiz.teste.dao;

import com.luiz.teste.exceptions.postgres.ReadSubjectDaoFindException;

import org.eclipse.microprofile.opentracing.Traced;
import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;

@Traced
@ApplicationScoped
public class ReadSubjectDao {
    private static ReadSubjectDao instance = new ReadSubjectDao();
    protected EntityManager em;
    
    public static ReadSubjectDao getInstance() {
        return instance;
    }
    
    private ReadSubjectDao() {
        if (em == null) {
            em = Persistence.createEntityManagerFactory("postgres").createEntityManager();
        }
    }

    public ReadSubject findById(int id) throws ReadSubjectDaoFindException {
        try {    
            return em.find(ReadSubject.class, id);
        }
        catch (NoResultException e) {
            return null;
        }
        catch (PersistenceException e) {
            throw new ReadSubjectDaoFindException(e);
        }
    }
}

以下是一個編寫 class 的 DAO 示例:

package com.luiz.teste.dao;

import com.luiz.teste.exceptions.mysql.WriteSubjectDaoFindException;
import com.luiz.teste.exceptions.mysql.WriteSubjectDaoPersistException;
import com.luiz.teste.exceptions.mysql.WriteSubjectDaoMergeException;

import org.eclipse.microprofile.opentracing.Traced;
import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;

@Traced
@ApplicationScoped
public class WriteSubjectDao {
    private static WriteSubjectDao instance = new WriteSubjectDao();
    protected EntityManager em;
    
    public static WriteSubjectDao getInstance() {
        return instance;
    }
    
    private WriteSubjectDao() {
        if (em == null) {
            em = Persistence.createEntityManagerFactory("mysql").createEntityManager();
        }
    }

    public WriteSubject findById(int id) throws WriteSubjectDaoFindException {
        try {    
            return em.find(WriteSubject.class, id);
        }
        catch (NoResultException e) {
            return null;
        }
        catch (PersistenceException e) {
            throw new WriteSubjectDaoFindException(e);
        }
    }
    
    public void persist(WriteSubject writeSubject) throws WriteSubjectDaoPersistException {
        EntityTransaction et = em.getTransaction();
        try {
            et.begin();
            em.persist(writeSubject);
            et.commit();
        }
        catch (Exception e) {            
            if (et.isActive())
                et.rollback();
            throw new WriteSubjectDaoPersistException(e);
        }
    }

    public void merge(WriteSubject writeSubject) throws WriteSubjectDaoMergeException {
        EntityTransaction et = em.getTransaction();
        try {
            et.begin();
            em.merge(writeSubject);
            et.commit();
        }
        catch (Exception e) {
            if (et.isActive())
                et.rollback();
            throw new WriteSubjectDaoMergeException(e);
        }
    }
}

以下是application.properties

# Configuration file
# key = value
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %X{requestID} %s%e%n

mp.metrics.tags=app=${quarkus.application.name},version=${quarkus.application.version}
%test.mp.metrics.tags=app=app-test,version=1.0.0

mp.openapi.filter=com.luiz.teste.dev.ext.filters.OpenApiFilter

quarkus.swagger-ui.path=/api-docs
quarkus.smallrye-openapi.path=/api-docs-json
quarkus.swagger-ui.always-include=true

quarkus.http.test-port=8083
quarkus.http.test-ssl-port=8446

quarkus.datasource.jdbc.enable-metrics=true

# Postgre - Build time
quarkus.datasource."postgres".db-kind=db2
quarkus.datasource."postgres".jdbc.url=${POSTGRE_JDBC}
quarkus.datasource."postgres".username=${POSTGRE_USER}
quarkus.datasource."postgres".password=${POSTGRE_PASSWORD}
quarkus.hibernate-orm."postgres".datasource=postgres
quarkus.hibernate-orm."postgres".packages=com.luiz.teste.models.postgres
quarkus.hibernate-orm."postgres".log.jdbc-warnings=false
quarkus.hibernate-orm."postgres".log.sql=true

# MySQL - Build time
quarkus.datasource."mysql".db-kind=mysql
quarkus.datasource."mysql".jdbc.url=${MYSQL_JDBC}
quarkus.datasource."mysql".username=${MYSQL_USER}
quarkus.datasource."mysql".password=${MYSQL_PASSWORD}
quarkus.hibernate-orm."mysql".datasource=mysql
quarkus.hibernate-orm."mysql".packages=com.luiz.teste.models.mysql
quarkus.hibernate-orm."mysql".log.jdbc-warnings=false
quarkus.hibernate-orm."mysql".log.sql=true

據我搜索過這個網站(以及通過https://www.google.com太),到目前為止我只知道使用persistence.xml

如何在調用createEntityManagerFactory時僅使用application.properties來獲得相同的結果?

更新(2022-01-03) :根據要求,從@RequestScoped更改為@ApplicationScoped並從postgre更改為postgres

在這里搜索了很多並搜索了任何答案后,終於找到了解決此問題的方法

要在Quarkus中創建 singleton 類,而不是在這些類上手動創建instance字段,您應該使用@Singleton注釋。

修復了 ReadSubjectDao.java

package com.luiz.teste.dao.postgres;

import com.luiz.teste.exceptions.postgres.ReadSubjectDaoFindException;

import org.eclipse.microprofile.opentracing.Traced;
import javax.inject.Singleton;
import javax.inject.Inject;
import io.quarkus.hibernate.orm.PersistenceUnit;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;

@Traced
@Singleton
public class ReadSubjectDao {
    @Inject
    @PersistenceUnit("postgres")
    EntityManager em;

    public ReadSubject findById(int id) throws ReadSubjectDaoFindException {
        try {    
            return em.find(ReadSubject.class, id);
        }
        catch (NoResultException e) {
            return null;
        }
        catch (PersistenceException e) {
            throw new ReadSubjectDaoFindException(e);
        }
    }
}

修復了 WriteSubjectDao.java

package com.luiz.teste.dao.mysql;

import com.luiz.teste.exceptions.mysql.WriteSubjectDaoFindException;
import com.luiz.teste.exceptions.mysql.WriteSubjectDaoPersistException;
import com.luiz.teste.exceptions.mysql.WriteSubjectDaoMergeException;

import org.eclipse.microprofile.opentracing.Traced;
import javax.inject.Singleton;
import javax.inject.Inject;
import io.quarkus.hibernate.orm.PersistenceUnit;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.transaction.Transactional;

@Traced
@Singleton
public class WriteSubjectDao {
    @Inject
    @PersistenceUnit("mysql")
    EntityManager em;

    public WriteSubject findById(int id) throws WriteSubjectDaoFindException {
        try {    
            return em.find(WriteSubject.class, id);
        }
        catch (NoResultException e) {
            return null;
        }
        catch (PersistenceException e) {
            throw new WriteSubjectDaoFindException(e);
        }
    }

    @Transactional
    public void persist(WriteSubject writeSubject) throws WriteSubjectDaoPersistException {
        try {
            em.persist(writeSubject);
        }
        catch (Exception e) {            
            throw new WriteSubjectDaoPersistException(e);
        }
    }

    @Transactional
    public void merge(WriteSubject writeSubject) throws WriteSubjectDaoMergeException {
        try {
            em.merge(writeSubject);
        }
        catch (Exception e) {
            throw new WriteSubjectDaoMergeException(e);
        }
    }
}

application.properties保持不變。
要調用這 2 個 singleton DAO 類中的任何一個,只需像往常一樣在調用者類上使用@Inject注釋。

你的模式非常奇怪。

如果您想要 singleton DAO,只需將@ApplicationScoped用於您的 DAO 的 scope。 不要讓它@RequestScoped然后有一個 static 實例,它會被破壞。

然后,使用 Quarkus,您不應該自己創建EntityManagerFactory 您可以只注入一個EntityManager

@Inject
@PersistenceUnit("postgre")
EntityManager entityManager;

你就完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM