对于我正在进行的项目,我需要将一些POJO持久保存到数据库中。 POJOs类定义有时是高度嵌套的,但是它们应该变平,因为嵌套是树状的并且不包含循环(并且基本元素最终是基元/字符串)。优选的是,所使用的解决方案为每种数据类型创建一个表,并且表将在POJO中具有每个基元成员一个字段。子类化和类似问题不是这个特定项目的问题。
是否有人知道任何现有的解决方案:
CREATE TABLE
定义
首选的解决方案可以通过对类文件的最小修改/注释和最少的外部配置来实现。
示例:
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
);
或类似的东西。
答案 0 :(得分:5)
我会使用标准化 Java Persistence API(JPA),最好使用注释。关于您的要求:
EntityManager#persist(Object entity)
就是这么做的。<T> T EntityManager#find(Class<T> entityClass, Object primaryKey)
就是这么做的。正如所暗示的,JPA是一个API,您需要一个实现来使用它。我的偏好是Hibernate Entity Manager或EclipseLink(请参阅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
之类的东西为您创建。