JakartaEE JPA容器管理的实体管理器,具有内存数据库

6yoyoihd  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(183)

我目前正在探索JakartaEE,有一个非常基本的应用程序,有几个jax-rs端点,一个服务和一个“存储库”,我的存储库使用EntityManger写入数据库,因为我只是测试,所以我想使用内存数据库;为此我选择了hsqldb。
现在我通过EntityManagerFactory自己创建EntityManger,因此,我还必须自己处理事务。
下一步,我想使用一个容器管理的EntityManager,该EntityManager使用@PersistenceContext注解,并且还能够使用@Transactional注解。
我为这种方法草拟的persistence.xml如下所示:

<persistence-unit name="test" transaction-type="JTA">
        <jta-data-source>TODO</jta-data-source>
        <class>demo.Jakarta.user.UserEntity</class>
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:hsqldb:mem:testdb;DB_CLOSE_DELAY=-1"/>
            <property name="jakarta.persistence.jdbc.user" value="sa"/>
            <property name="jakarta.persistence.jdbc.password" value=""/>
            <property name="jakarta.persistence.schema-generation.database.action" value="create"/>
        </properties>
    </persistence-unit>

现在你可能已经知道了,我在jta-data-source方面遇到了一些麻烦,我找到了一些旧的参考(glasfish 4.5),在那里你可以创建一个特定于供应商的xml文件来声明数据源。
是否有一种编程方法来声明此资源并确保JNDI查找不会在启动时失败?

f2uvfpb9

f2uvfpb91#

作为直接在应用服务器中定义数据源的替代方法,您可以使用带有注解jakarta.annotation.sql.DataSourceDefinition的bean,例如:

import jakarta.annotation.sql.DataSourceDefinition;

@DataSourceDefinition(
    class = "org.hsqldb.jdbcDriver",
    name = "yourdatasourcename",
    url = "jdbc:hsqldb:mem:bookdb;DB_CLOSE_DELAY=1",
    user = "sa",
    password = "sa")
public class YourDefinitionClass {
}

请参考javadoc来理解这个策略的所有警告,还要注意,这种数据源数据的编码锁会使你的项目不那么容易移植。
由于持久性单元数据源将使用<jta-data-source>获取,因此应该删除persistence.xml的所有连接属性。

相关问题