0

我正在为我的项目开发 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>

设置持久性单元后,我创建了实体管理器

Persistence.createEntityManagerFactory("SADPU", map);

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

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

我做错了吗?

4

1 回答 1

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 调用中,看看是否可行。

于 2013-06-11T16:59:38.143 回答