代码之家  ›  专栏  ›  技术社区  ›  VeeArr

自动持久化复杂Java对象

  •  1
  • VeeArr  · 技术社区  · 16 年前

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

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

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


    例子:

    //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
    );
    

    5 回复  |  直到 16 年前
        1
  •  2
  •   Matheus Moreira    16 年前

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

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

    如果你是新来冬眠,我推荐好的 Hibernate documentation 作为参考和本书 Java Persistence with Hibernate

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

        2
  •  5
  •   Community Mohan Dere    9 年前

    我会用 标准化 Java Persistence API

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

    Hibernate Entity Manager EclipseLink (见 this previous question ).

        3
  •  1
  •   Uri    16 年前

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

    Hibernate教程提供了许多与您提供的代码类似的示例。

        4
  •  1
  •   TheLQ    16 年前

    强烈推荐的框架是 JPersist

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

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

        5
  •  0
  •   Bozho    16 年前

    @Embeddable @Embedded :

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

    您可以手动创建基础架构,或者 hbm2ddl.auto=update 为你创造它。