自动保留复杂的Java对象

时间:2010-06-09 18:23:32

标签: java sql hibernate persistence

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

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

  1. 从类定义
  2. 自动生成CREATE TABLE定义
  3. 给定对象的实例
  4. ,自动生成查询以将对象持久保存到数据库
  5. 自动生成查询以从数据库中检索对象,并在给定密钥的情况下将其作为POJO返回。
  6. 首选的解决方案可以通过对类文件的最小修改/注释和最少的外部配置来实现。


    示例:

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

    或类似的东西。

5 个答案:

答案 0 :(得分:5)

我会使用标准化 Java Persistence API(JPA),最好使用注释。关于您的要求:

  1. 规范并不要求这样做,但大多数JPA提供程序(所有主要实现都支持)都支持从映射元数据生成DDL。
  2. EntityManager#persist(Object entity)就是这么做的。
  3. <T> T EntityManager#find(Class<T> entityClass, Object primaryKey)就是这么做的。
  4. 正如所暗示的,JPA是一个API,您需要一个实现来使用它。我的偏好是Hibernate Entity ManagerEclipseLink(请参阅this previous question)。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:1)

强烈推荐的框架是JPersist,这是一个非常简单的数据库到POJO框架。不需要XML或注释。我将它用于我的项目,因为如果我想要一个新的表对象,我只需创建一个bean。

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

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

答案 4 :(得分:0)

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

@Embeddable
class TypeB {
  int id;
  int someData;
}


class TypeA {
  ....
  @Embedded
  TypeB data1;
}

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