HSQLDB EJB3.0 Hibernate 无法连接到数据库

Posted

技术标签:

【中文标题】HSQLDB EJB3.0 Hibernate 无法连接到数据库【英文标题】:HSQLDB EJB3.0 Hibernate Cannot Connect to DB 【发布时间】:2011-04-20 14:28:15 【问题描述】:

我正在尝试创建一个 EJB3.0 容器管理的持久性 bean,但在连接到单元测试使用的内存 HSQLDB 时遇到问题。我将 OpenEJB 用于我的独立容器实现。

我的持久性 XML 中有以下内容。

    <persistence-unit name="wyvern-unit-test">
    <description>In-memory HSQLDB database persistence unit used for unit testing.</description>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.acme.test.model.LogEntry</class>
    <class>com.acme.test.modell.Addressee</class>
    <properties>
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:db"/>
        <property name="hibernate.connection.username" value="sa"/>
        <property name="hibernate.connection.password" value=""/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
</persistence-unit>

这是我的服务 bean:

@Stateless
public class LogEntryServiceBean implements LogEntryService 

@PersistenceContext
private EntityManager entityManager;

@Override
public LogEntry find(String uuid) 
    return entityManager.find(LogEntry.class, uuid);


@Override
public void save(LogEntry logEntry) 
    entityManager.merge(logEntry);


@Override
public void remove(LogEntry logEntry) 
    entityManager.remove(entityManager.merge(logEntry)); // NOTE: [MF] Using "seek and destroy" pattern.


这是我的单元测试:

public class LogEntryServiceBeanTest 

private static Context context;

@BeforeClass
public static void beforeClass() 
    context = EJBContainer.createEJBContainer().getContext();


@AfterClass
public static void afterClass() throws NamingException 
    context.close();


@Test
public void createLogEntryTest() throws NamingException 
    LogEntryService logEntryService = (LogEntryService) context.lookup("java:global/classes/LogEntryServiceBean");
    LogEntry logEntry = new LogEntry();
    Addressee addressee = new Addressee();
    logEntry.setSummary("This is a log entry.");
    addressee.setName("John Smith");
    addressee.setEmailAddress("john.smith@acme.com.au");
    logEntry.getAddressees().add(addressee);
    logEntryService.save(logEntry);



当我运行单元测试时,出现以下错误:

java.sql.SQLException:分配连接时出错。原因:无法分配连接,因为:java.net.ConnectException:连接到端口 1527 上的服务器 localhost 时出错,消息连接被拒绝。

关于我做错了什么(或根本没有做)的任何想法?

谢谢

【问题讨论】:

【参考方案1】:

我是个白痴。我正在启动 EJB3.0 嵌入式容器,它使用 GlassFish 库而不是在 VM 内 OpenEJB 嵌入式容器上。

即:

@BeforeClass
public static void beforeClass() 
   context = EJBContainer.createEJBContainer().getContext();

应该是:

@BeforeClass
public static void beforeClass() 
    Properties properties = new Properties();
    properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    context = new InitialContext(properties);

另外,因为 HSQLDB 是一个非 JTA 数据源,我需要按如下方式指定我的 persistence.xml 持久性单元:

<persistence-unit name="wyvern-unit" transaction-type="RESOURCE_LOCAL">

【讨论】:

以上是关于HSQLDB EJB3.0 Hibernate 无法连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB + JUnit + Hibernate:java.sql.SQLException:无效的模式名称

EJB3.0

EJB3.0的一些学习

Hibernate结合JPA05

如何为 Hibernate 设置 HSQLDB?

org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话。 Spring + Hibernate + HSQLDB