gpt4 book ai didi

java - 在运行时动态添加实体类

转载 作者:IT老高 更新时间:2023-10-28 21:03:36 25 4
gpt4 key购买 nike

我需要在运行时将实体类添加到持久性单元,而不是在 persistence.xml 中指定所有实体类。有人可以帮助我吗?

我知道 Hibernate 有自己的机制来做同样的事情:

AnnotationConfiguration.addAnnotatedClass(Class) 等 - 您还可以通过编程方式添加 hibernate 配置 (*.hbm.xml) 文件。

要求是在不重新启动应用服务器的情况下,我应该能够动态地将实体类/它们的配置(映射)文件添加到持久化单元。

但在运行时以编程方式将实体类/配置文件添加到持久性单元的解决方案不应特定于 JPA 实现。

最佳答案

JPA 尚未提供此功能。您可以查看以下三个选项:

  • This work around :
    1. 使用新的持久性单元即时生成 persistence.xml(简单的 XML 文件创建)。
    2. 动态添加持久化文件到类路径(URLCLassLoader)
    3. 要求 PersistenceProvider 加载新的持久化单元(createEntityManagerFactory)

我确实实现了这个解决方法。但是,随着实体数量的增长(100+),它的扩展性并不好。我终于切换到 JDBC。这是从 JPA 切换到 JDBC 之前和之后的内存消耗 (-75%) 的捕获。

Memory consumption reduction by switching from JPA to JDBC

注意

如果 JPA 提供者是 Hibernate,从 Hibernate 4.0 开始,可以直接将实体传递给这个 JPA 提供者而不用在 persistence.xml 文件中声明它们。 Hibernate 将动态处理实体。

这里是 JPA 2.1 + Hibernate 4.3.7.Final 的示例配置,没有声明任何实体:

META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">

<persistence-unit name="my-persistence-unit"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- Database Properties -->
<property name="javax.persistence.jdbc.url"
value="jdbc:postgresql://localhost:5432/my-database" />
<property name="javax.persistence.jdbc.user" value="login" />
<property name="javax.persistence.jdbc.password" value="password" />

<!-- Hibernate Properties -->
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.default_schema" value="public" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />

<!-- Connection Pool -->
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="500" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="2000" />
</properties>
</persistence-unit>

</persistence>

引用文献

关于java - 在运行时动态添加实体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com