首页 > 解决方案 > 如何在程序启动时初始化persistance.xml 变量?

问题描述

基本上我在 PostgreSQL 数据库中执行插入操作,但由于我有多个数据库,我必须根据每个环境更改配置。

问题是我使用了一种不太好的方法来做到这一点,因为每次我进行插入时,我都会替换所有变量,这非常慢并且绝对不是实现这一目标的好方法。

我如何能够执行相同的插入,但在我的 Api 启动时配置它?

这是我目前正在做的事情:

package br.jus.tjba.dje.local.service;

import br.jus.tjba.dje.local.entity.Conteudo;
import br.jus.tjba.dje.local.repository.ConteudoRepository;

import br.jus.tjba.tjfw4.core.service.AbstractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class ConteudoService extends AbstractService {

    @Autowired
    private ConteudoRepository conteudoRepository;

    public EntityTransaction insertInDb(String something, String somethingElse) {

        Map<String, String> env = System.getenv();
        Map<String, Object> configOverrides = new HashMap<>();

        // Here I change my persistance.xml configs
        for(Map.Entry<String, String> entry: env.entrySet()) {
            if (entry.getKey().contains("DATABASE_URL")) {
                configOverrides.put("javax.persistence.jdbc.url", env.get(entry.getValue()));
            } else if (entry.getKey().contains("DATABASE_USER")) {
                configOverrides.put("javax.persistence.jdbc.user", env.get(entry.getValue()));
            } else if (entry.getKey().contains("DATABASE_PASSWORD")) {
                configOverrides.put("javax.persistence.jdbc.password", env.get(entry.getValue()));
            }
        }

        // Cria um factory dando override nas variáveis.
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("default", configOverrides);
        EntityManager conteudoManager = factory.createEntityManager();

        Query query = conteudoManager.createNativeQuery("INSERT INTO something(" +
                "SOMETHING," +
                "SOMETHING_ELSE)" +
                " VALUES (" +
                ":something," +
                ":somethingElse)");

        conteudoManager.getTransaction().begin();

        query.setParameter("something", something);
        query.setParameter("somethingElse", somethingElse);
        query.executeUpdate();
        return conteudoManager.getTransaction();

    }

    public Conteudo getContent() {
        return conteudoRepository.getContent();
    }

}

还有我的persistance.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="javax.persistence.jdbc.url" value="url" />
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.password" value="password" />
            <property name="javax.persistence.jdbc.user" value="login" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

标签: javapostgresqljpa

解决方案


推荐阅读