Eclipselink:在JavaSE中使用时没有在glassfish中找到合适的驱动程序

时间:2014-01-04 14:57:33

标签: postgresql java-ee jpa glassfish eclipselink

我正在尝试在我的webapp中创建EntityManager,但它失败了:

找不到合适的jdbc驱动程序:postgresql :: // localhost / database

但是,当我将其作为JavaSE控制台应用程序(来自main())运行时,相同的持久性单元和用于创建EntityManager的相同代码也能正常工作。

谷歌搜索给了我几个导致错误的常见问题:

  • JDBC网址错误 不应该是因为它适用于主

  • JDBC驱动程序不在类路径中 我可以使用Class.forName("org.postgresql.Driver");为驱动程序创建一个Class对象,所以我认为它在类路径中。

我试过的其他事情:

  • 我想也许来自glassfish / lib的驱动程序jar和webapp / WEB-INF / lib在某种程度上是冲突的,所以我尝试将它们一起分开,没有运气。

  • 重新创建了一个小的新webapp,希望问题能够消失,但它没有: - )

  • 注入@PersistanceUnit - 也没有用,不知道它是同一个问题还是我没有正确使用它,因为我还在学习注入和EJB

由于

完整错误:

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost/database Error Code: 0

以下是代码:

webapp中的ManagedBean:

@ManagedBean
public class TestBean {
private String entry;
private String driver;

public String getFromDatabase(){
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("Unit1");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    EntityOne one = new EntityOne();
    one.id = 1;
    one.entry = "Bla bla";


    em.persist(one);
    tx.commit();
    em.close();

    return "done";
}

public String createDriver(){
    try {
        Class d = Class.forName("org.postgresql.Driver");
        driver = d.getName();

    } catch (ClassNotFoundException e) {
        driver = "Class not found";
        return "";
    }

    return "";
}


public String getDriver() {
    return driver;
}

public void setDriver(String driver) {
    this.driver = driver;
}

public String getEntry() {
    return entry;
}

public void setEntry(String entry) {
    this.entry = entry;
}
}

在main中使用相同的代码:

public class Standalone {

public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("Unit1");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    EntityOne one = new EntityOne();
    one.id = 1;
    one.entry = "Bla bla";


    em.persist(one);
    tx.commit();
    em.close();


    }
}

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="Unit1" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

    <class>com.test.EntityOne</class>

    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/database"/>
        <property name="javax.persistence.jdbc.user" value="darko"/>
        <property name="javax.persistence.jdbc.password" value="sifra"/>

        <property name="eclipselink.target-database" value="PostgreSQL"/>

    </properties>
</persistence-unit>

1 个答案:

答案 0 :(得分:0)

将postgres jdbc驱动程序放入glassfish库中。它是这样的。

[glassfish_home]/glassfish/domains/YOUR_DOMAIN/lib/

此外,在此之后重新启动服务器。