[Resolvido] JPA com Eclipselink não cria o database

PessoALL, boa tarde.

Já faz dois dias que estou na luta aqui, e não consigo sair do lugar. Inicialmente, eu costumo utilizar o eclipselink (jpa 2.1) para persistência no banco de dados - já faço isso há uns três anos. Mas, agora, o contexto mudou e eu preciso que o database seja criado automaticamente. E não estou conseguindo isso. Nem com uma classe mais simples possível:



@Entity
public class Cidade implements Serializable {

    @Id
    private Long id;

    @Column(length=2)
    @Basic
    private String uf;

    @Column(length=100)
    @Basic
    private String descricao;

    @Version
    private int version;

    public Cidade() {

    }
   
//getters e setters omitidos
}

e com o seguinte arquivo de persistência:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="PUCloud" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>meupacote.Cidade</class>
  </persistence-unit>
</persistence>

Estou setando uma fábrica de EntityManager:

    public static synchronized EntityManager getEntityManager(String nomePu, final String senhaDeCripto, final String usuario) throws Exception  {
        if (emf==null) {
            emf  = Persistence.createEntityManagerFactory(nomePu, new HashMap<String, String>() {
                private static final long serialVersionUID = 1L;
                {
                    put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/meuBanco");
                    put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");
                    put("javax.persistence.jdbc.password", senhaDeCripto);
                    
                    put("javax.persistence.jdbc.user", usuario);
                    //put("hibernate.hbm2ddl.auto", "update");
                    //put("javax.persistence.schema-generation.database.action", "drop-and-create");
                    //put("javax.persistence.schema-generation.create-source", "metadata");
                    //put("javax.persistence.schema-generation.create-database-schemas", "true");                    
                    //put("javax.persistence.schema-generation.database.action", "drop-and-create");
                    //put("eclipselink.ddl-generation", "drop-and-create-tables");
                    //put("eclipselink.create-ddl-jdbc-file-name", "createDDL_ddlGeneration.jdbc");
                    //put("eclipselink.drop-ddl-jdbc-file-name", "dropDDL_ddlGeneration.jdbc");
                    //put("eclipselink.ddl-generation.output-mode", "database");
                }
            });            
        }
        return emf.createEntityManager();
    }

Estão vendo as linhas em comentário no método acima? Então… já tentei TODAS… literalmente, inclusive com o conjunto de uma + outra, na tentativa de descobrir o motivo do erro. Sempre que eu rodo o projeto, aparece a mensagem:

[EL Severe]: ejb: 2016-07-12 16:13:37.281--ServerSession(1140466313)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'meuBanco'

Já chequei o usuário e ele está com todas as permissões no banco (inclusive já usei o usuário root para verificar isso…).

Alguém consegue ver e me falar onde eu estou errando?

Acredito que o JPA não faz isso.

Até onde sei, o database deve ser criado manualmente para, então, as tabelas serem criadas no mesmo.

E se você realmente precisa disso, creio que a solução seria algum esquema via programação mesmo, tipo executar o comando de criação via código.

Valeu Lucas pela pronta resposta…

Já li em um monte de lugares que a criação do schema é automático pelo JPA… mas já tentei de tudo… rs…

Vou esperar mais alguém dar alguma ideia. Caso contrário, terei que partir para a sua solução, mesmo.

Entendi. Fui ver a documentação e achei um link de um exemplo que diz sobre a criação do schema, veja: http://wiki.eclipse.org/EclipseLink/Examples/JPA/DDL. Talvez te ajude em algo.

Bom… parti para outra abordagem:

Antes da criação da EntityManager, fiz o seguinte:

            try {
                Connection connection = DriverManager.getConnection("jdbc:mysql://"+host+":"+porta+"/?user=" + usuario+"&password="+senhaDeCripto);
                Statement stmt = connection.createStatement();
                stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS `" + nomeBanco + "`;");
            } catch () {
            }
            // aí basta continuar a criação do EntityManager
            emf  = Persistence.createEntityManagerFactory(nomePu, new HashMap<String, String>() {