Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在persistence.xml中不指定数据库用户名和密码的可移植JPA应用程序_Java_Jpa_Eclipselink_Persistence.xml - Fatal编程技术网

Java 在persistence.xml中不指定数据库用户名和密码的可移植JPA应用程序

Java 在persistence.xml中不指定数据库用户名和密码的可移植JPA应用程序,java,jpa,eclipselink,persistence.xml,Java,Jpa,Eclipselink,Persistence.xml,我正在为我的项目开发一个JPA应用程序。我正在使用eclipselink。我找到了本教程,但它不适合我的应用程序的复杂性 我想为数据库的用户名、密码和url创建一个外部文件,这样就不会在每次更改用户名和密码或数据库的主机名时都更改persistence.xml文件 这就是我正在使用的代码 Map map = new HashMap(); map.put(PersistenceUnitProperties.JDBC_USER, "root"); map.put(PersistenceUnitPr

我正在为我的项目开发一个JPA应用程序。我正在使用eclipselink。我找到了本教程,但它不适合我的应用程序的复杂性

我想为数据库的用户名、密码和url创建一个外部文件,这样就不会在每次更改用户名和密码或数据库的主机名时都更改persistence.xml文件

这就是我正在使用的代码

Map map = new HashMap();
map.put(PersistenceUnitProperties.JDBC_USER, "root");
map.put(PersistenceUnitProperties.JDBC_PASSWORD, "toor");
map.put(PersistenceUnitProperties.JDBC_URL, "jdbc:mysql://localhost:3306/sad?zeroDateTimeBehavior=convertToNull");
map.put(PersistenceUnitProperties.JDBC_DRIVER, "com.mysql.jdbc.Driver");
上面的代码抛出一个异常

这是我的persistence.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="SADPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>sad.entity.Credential</class>
<class>sad.entity.Customer</class>
<class>sad.entity.Employee</class>
<class>sad.entity.HourlyRate</class>
<class>sad.entity.Item</class>
<class>sad.entity.Product</class>
<class>sad.entity.ProductTransaction</class>
<class>sad.entity.Province</class>
<class>sad.entity.Tax</class>
<class>sad.entity.TransactionParticular</class>
<class>sad.entity.WorkingHours</class>
<class>sad.entity.Zero</class>
</persistence-unit>
我删除了properties标签以测试我是否可以实现我想要的,但它抛出了一个异常

异常描述:无法从驱动程序[null]、用户[null]和URL[null]获取连接。验证是否已设置预期的驱动程序类和URL。检查您的登录名、persistence.xml或sessions.xml资源。应该将jdbc.driver属性设置为与数据库平台兼容的类


我做错了吗?

我创建了一个便携式控制器类,如下所示:

public class SwagJpaController implements Serializable {

    public static final String PERSISTENCE_UNIT = "MyDBPU";

    public SwagJpaController(String database) {
        Map<String, String> properties = new HashMap<String, String>();
        properties.put("javax.persistence.jdbc.url", 
                "jdbc:mysql://localhost:3306/" + database + "?zeroDateTimeBehavior=convertToNull");
        this.emf = Persistence.createEntityManagerFactory(
                SwagJpaController.PERSISTENCE_UNIT, properties);
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
}
公共类SwagJpaController实现可序列化{
公共静态最终字符串持久性_UNIT=“MyDBPU”;
公共SwagjPacController(字符串数据库){
映射属性=新的HashMap();
properties.put(“javax.persistence.jdbc.url”,
“jdbc:mysql://localhost:3306/“+数据库+”?zeroDateTimeBehavior=convertToNull”);
this.emf=Persistence.createEntityManagerFactory(
SwagJpaController.u单元、属性);
}
私有EntityManagerFactory emf=null;
公共实体管理器getEntityManager(){
返回emf.createEntityManager();
}
}

我建议将属性键作为硬编码字符串放置在Map.put调用中,并查看是否有效

API只告诉您映射中的属性将覆盖配置中的属性,但不告诉您这些属性可以在配置中保持未定义状态。听起来很奇怪,尝试在配置中定义一些虚拟属性,然后重试;也许只是一些配置检查提前启动了它(如果是这样的话,它看起来更像是一个bug而不是一个功能)。谢谢你提醒我地图。我在代码中发现了错误。这不是API的错。我想我需要休息一下。
public class SwagJpaController implements Serializable {

    public static final String PERSISTENCE_UNIT = "MyDBPU";

    public SwagJpaController(String database) {
        Map<String, String> properties = new HashMap<String, String>();
        properties.put("javax.persistence.jdbc.url", 
                "jdbc:mysql://localhost:3306/" + database + "?zeroDateTimeBehavior=convertToNull");
        this.emf = Persistence.createEntityManagerFactory(
                SwagJpaController.PERSISTENCE_UNIT, properties);
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
}