便携式JPA应用程序,但未在persistence.xml中指定数据库用户名和密码

时间:2012-10-07 18:32:22

标签: java jpa eclipselink persistence.xml

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

我想为数据库的用户名,密码和url创建一个外部文件,这样每次更改用户名和密码或db的主机名时都不会更改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>

设置持久性单元后,我用

创建了实体管理器
Persistence.createEntityManagerFactory("SADPU", map);

我删除了属性标记以测试我是否可以实现我想要的但是它会引发异常

  

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

我做错了吗?

1 个答案:

答案 0 :(得分:0)

我设法创建了一个可移植的Controller类,如下所示:

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();
    }
}

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