【问题标题】:Java EE/JPA way to add new tables/entities to database向数据库添加新表/实体的 Java EE/JPA 方式
【发布时间】:2011-12-27 20:38:33
【问题描述】:

我有一个 mysql 数据库,我想添加向数据库添加新表的功能。我可能很容易为此找到 JPQL 的示例,但是我将如何自动为这个新表生成实体,以便我可以在我的 JPA 代码的其余部分中引用它来更新和从表中删除我通常引用实体不是实际的表本身。

我现在使用 eclip 从我创建的表中生成的实体。但是在部署之后,我们显然不会让 Eclipse 来执行此操作,因此我们需要在每次创建表时自动完成。

【问题讨论】:

    标签: mysql jakarta-ee jpa jpql


    【解决方案1】:

    动态创建和映射新表不是 JPA 支持的。它需要动态创建新的 Java 类并动态更新映射元数据。您可以使用 JDBC 或本机查询做任何您想做的事情。但也许您应该解释为什么需要动态创建新表。

    【讨论】:

    • 我不知道我需要经常创建表。我认为,如果您正确创建架构,则应该创建新表。但是,如果我们这样做了,我总是可以将服务器项目重新构建并使用新映射进行部署。我只是想知道这是否可能,因为有人问我是否可以。
    • 要添加新映射,您确实必须重新部署应用程序的新版本。您可能还必须执行一些模式迁移脚本,因为这个新表很有可能会影响现有表(新外键、设计更改等)。只需确保在生产服务器上执行之前测试整个过程,以确保停机时间尽可能短。
    • 好点。尽管我认为至少对于向我提出的问题,这些表将独立于其他没有关系和键的表。但是要生成实体,我必须重新部署,所以这仍然是个坏主意。
    【解决方案2】:

    有几种方法可以创建表格。最常见的生产用途是 DBA(或担任该角色的开发人员)独立于应用程序创建数据库架构(表等)。

    这是典型的,因为应用程序随后会对数据库中的数据进行建模,并且普遍认为数据库通常比应用程序寿命更长。

    可以让 JPA 提供者自动创建模式。 JPA 注释上甚至还有几个专门用于此目的的属性(例如 nullable 属性 JoinColumn)。

    通过persistence.xml 中的提供者特定属性激活此功能。例如。 hibernate.hbm2ddl.auto 用于 Hibernate(用于 JBoss AS),eclipselink.ddl-generation 用于 EclipseLink(用于 GlassFish)。

    有关一些示例,请参阅 http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBoss

    在表中插入实体是完全不同的事情。从您的问题中,您可能会觉得您可能无法完全理解这两者之间的区别。它通过例如发生EntityManager#persist,但我不能 100% 确定这是否是您所要求的。

    【讨论】:

      【解决方案3】:

      您可以配置您的休眠属性或 persistence.xml 以在服务器启动时更新数据库。它会自动更新表格。 查看 hibernateDialect 参数旁边。

      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      

      是你想要的。 正如@JB Nizet 在他的回答中所说,我不认为您想即时创建实体类并希望在不重新部署的情况下创建表。

      【讨论】:

        猜你喜欢
        • 2018-08-24
        • 2014-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多