【问题标题】:Automatically Persisting a Complex Java Object自动持久化复杂的 Java 对象
【发布时间】:2010-06-09 18:23:32
【问题描述】:

对于我正在进行的项目,我需要将一些 POJO 持久化到数据库中。 POJO 类定义有时是高度嵌套的,但它们应该扁平化,因为嵌套是树状的并且不包含循环(并且基本元素最终是原语/字符串)。使用的解决方案最好为每种数据类型创建一个表,并且这些表在 POJO 中的每个原始成员都有一个字段。子类化和类似问题不是这个特定项目的问题。

有没有人知道任何现有的解决方案可以:

  1. 从类定义中自动生成CREATE TABLE 定义
  2. 在给定对象实例的情况下,自动生成查询以将对象持久保存到数据库中
  3. 在给定键的情况下,自动生成查询以从数据库中检索对象并将其作为 POJO 返回。

首选可以通过对类文件进行最少修改/注释和最少外部配置的解决方案。


例子:

Java 类

//Class to be persisted
class TypeA {
  String guid;
  long timestamp;
  TypeB data1;
  TypeC data2;
}

class TypeB {
  int id;
  int someData;
}

class TypeC {
  int id;
  int otherData;
}

可以映射到

CREATE TABLE TypeA (
  guid CHAR(255),
  timestamp BIGINT,
  data1_id INT,
  data1_someData INT,
  data2_id INt,
  data2_otherData INT
);

或类似的东西。

【问题讨论】:

    标签: java sql hibernate persistence


    【解决方案1】:

    我会使用 standardized Java Persistence API (JPA),最好带有注释。关于您的要求:

    1. 规范不要求这样做,但大多数 JPA 提供程序(所有主要实现都支持)支持从映射元数据生成 DDL。
    2. EntityManager#persist(Object entity) 就是这样做的。
    3. <T> T EntityManager#find(Class<T> entityClass, Object primaryKey) 就是这样做的。

    正如所暗示的,JPA 是一个 API,您需要一个实现才能使用它。我更喜欢Hibernate Entity ManagerEclipseLink(见this previous question)。

    【讨论】:

    • +1 是唯一推荐 JPA 的人。也许链接到 EE 6 JPA tutorial
    • @Justin 确实是更好的链接。答案随之更新。谢谢。
    【解决方案2】:

    Hibernate 可以帮助您解决您列出的所有三个问题。

    (1) 您需要注释您的实体类,以便 Hibernate 能够在类/对象之间映射到表/行。 Hibernate 使用约定优于配置的方法,因此可以只使用一些注释并准备好完整的 o/r 映射以供使用。您可以使用 hibernate.hbm2ddl.auto 配置选项来指示 Hibernate 在首次创建会话工厂时自动验证/导出和模式 DDL。

    (2) / (3) Hibernate 有足够的关于类、数据库模式和映射的信息,可以轻松地为简单的 CRUD 操作生成 SQL 语句。您可以微调 Hibernate 如何加载和持久化对象树。关联映射注释具有 fetch 和 cascade 选项,可让您指定如何获取关联对象(惰性/急切)以及如何通过对象树传播操作。有关这些选项的详细信息,请参阅 Hibernate 文档。

    如果您是 Hibernate 的新手,我推荐好的 Hibernate documentation 作为参考和书 Java Persistence with Hibernate 以更深入地了解框架(它有关于获取和级联的非常好的部分)。

    在典型情况下,Hibernate 只需要一点配置(一个hibernate.cfg.xml 文件)。您可以使用 XML 文件(不好)或注释(新项目的“默认”选项)定义映射。

    【讨论】:

      【解决方案3】:

      您将问题标记为休眠。您是否尝试过为此使用 Hibernate?

      只要你定义好集合应该如何映射(例如,一对多),我发现它通常对这种事情非常有效。

      Hibernate 教程提供了大量与您提供的代码类似的情况的示例。

      【讨论】:

      • 我确实查看了 Hibernate,但找不到任何允许我在给定已经存在的类描述的情况下自动生成 SQL 描述的功能。你知道 Hibernate 的任何部分可以用来做这个(或者可以作为谷歌搜索的基础)吗?
      • 您是否需要实际的 SQL 来记录日志?我的意思是,Hibernate 将为所有这些执行 SQL,包括在您选择的数据库中创建表。有一个日志记录选项,它也可以转储 SQL。如果你真的想在你的程序中操作 SQL(为什么?),那可能是可行的,但我不确定如何。
      • 我不清楚,抱歉。我的意思是我不想自己手动创建表,也不想将 Java 对象逐个字段映射到数据库中的字段。我不需要实际使用的 SQL(如您所说,除了可能的日志记录目的)。
      • Hibernate 包含一个名为 hbm2dll 的工具,它会为您生成数据库架构。
      【解决方案4】:

      强烈推荐的框架是JPersist,这是一个极其简单的 Database-to-POJO 框架。不需要 XML 或注释。我在我的项目中使用它,因为如果我想要一个新的表对象,我只需创建一个 bean。

      在您的情况下,问题是您想要为您设置数据库。这样做会非常困难,而且您对框架的要求很高。使用 JPersist,您应该能够从类名和字段中的列创建一个 db 表,然后使用 phpMyAdmin 的设计器来解析引用。

      现在阅读 JPersist 文档的 5 分钟将在以后节省数小时的开发时间。

      【讨论】:

      • JPersist 看起来很诱人,因为它不需要注释或映射。但是,从我查看文档的几分钟来看,我似乎需要提前手动设置数据库表。不幸的是,由于每个数据类型可能有超过 100 个字段,并且有近 100 种数据类型,我不想这样做。
      【解决方案5】:

      JPA 提供了足够的选项来执行此操作。例如,您可以使用@Embeddable@Embedded

      @Embeddable
      class TypeB {
        int id;
        int someData;
      }
      
      
      class TypeA {
        ....
        @Embedded
        TypeB data1;
      }
      

      您可以手动创建底层架构,也可以让hbm2ddl.auto=update 之类的东西为您创建它。

      【讨论】:

        猜你喜欢
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 2012-01-11
        • 2015-11-11
        • 1970-01-01
        • 2013-10-12
        • 2018-09-17
        相关资源
        最近更新 更多