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:无效的模式名称
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话。 Spring + Hibernate + HSQLDB