HSQLDB EJB3.0 Hibernate не может подключиться к БД - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь создать управляемый контейнером EJB3.0 персистентный компонент, и у меня возникают проблемы с подключением к 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>

И это мой служебный компонент:

@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 с сообщением «Отказ в соединении».

Любые идеи о том, что я делаю неправильно (или невсе)?

Спасибо

1 Ответ

1 голос
/ 21 апреля 2011

Я идиот. Я запускал встроенный контейнер EJB3.0, который использует библиотеки GlassFish вместо этого во встроенном контейнере OpenEJB в VM.

То есть:

@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">
...