【问题标题】:Any ORM without hardcoding table structure in Java? [closed]Java中有没有硬编码表结构的ORM? [关闭]
【发布时间】:2016-07-08 00:18:48
【问题描述】:

我已经在数据库中创建了表。

即数据库是第一位的。

数据库结构可以改变。

我不想自己为此结构重写 ORM 字段。我不想使用任何工具(如 Hibernate 或 JPA 工具)重新生成任何映射。

即任何数据库反射都应该在运行时进行。

在这种情况下,我还能从 Spring Data JPA、Hibernate、jOOQ 等任何 ORM 库中获得一些好处吗?

我还是更喜欢一些像这样的吸气剂

public Object get(String fieldName);

和像二传手这样的人

public void set(String fieldName, Object fieldValue);

例如,这是在Apache's DynaBean 中实现的。

同时我希望Active Record 即对象实例代表数据库记录。

这可能吗?

【问题讨论】:

  • “在 Java 中没有硬编码表结构”是什么意思?您不想使用任何注释?
  • 仅可选。如果我愿意,我会声明一个属性并对其进行注释。但如果没有,我应该能够拥有动态属性。从数据库中读取的任何记录都应包含动态 getter 可访问的所有字段。
  • “动态属性”,“动态吸气剂”?你不会使用标准的 POJO 类来记录吗?
  • 因为我不想在每次数据库结构更改时重构它们。
  • 假设我添加了新字段或重命名了旧字段。我不想重构和重新编译我的应用程序。

标签: java activerecord orm jooq spring-orm


【解决方案1】:

使用 SQLJ。它满足您的所有要求:“数据库优先”继续保持,数据库可以更改结构,并且您不必重写任何类型的 ORM 资源,因为 没有 ORM 资源。

也就是说,如果数据库更改对非常有效的您已包含在来源中的查询。我希望你没想到会有这种灵丹妙药。

至于“同时我希望......对象实例代表数据库记录”当然这是不可能的(如果类结构应该始终是表/查询结构),如果您的系统对“不完美的形象”“更有弹性”,那么您有这样的现象,即对于数据库中的某些数据,无法将其发送到您的类(因为类尚未适应包含附加列),或者对于类中的某些字段,将无法填充(因为它们的源已从数据库中删除)。我敢肯定,一旦你体验过这样的现象,你会重新考虑是否说过你想要那种弹性。每当数据库更改结构时,替代方案就是更多的运行时错误。真的确定这就是你想要的吗?

真的。你的问题听起来很像“我想要工作程序,但我不想编写代码”。

【讨论】:

    【解决方案2】:

    由于您在不同 ORM 的上下文中寻找答案,所以我将从 jOOQ 的角度做出回应。虽然 jOOQ 最适合为您的表/列生成代码,但这只是一个选项。可以在此处的手册中看到将 jOOQ 与“普通 SQL”表和列一起使用的示例: http://www.jooq.org/doc/latest/manual/getting-started/use-cases/jooq-as-a-standalone-sql-builder

    create.select(field("BOOK.TITLE"), field("AUTHOR.FIRST_NAME"), field("AUTHOR.LAST_NAME"))
          .from(table("BOOK"))
          .join(table("AUTHOR"))
          .on(field("BOOK.AUTHOR_ID").equal(field("AUTHOR.ID")))
          .where(field("BOOK.PUBLISHED_IN").equal(1948))
          .fetch();
    

    然后可以使用String 形式的列名来操作结果记录:

    Object value = record.getValue("TITLE");
    

    (免责声明:我为 jOOQ 背后的公司工作)

    【讨论】:

      【解决方案3】:

      有一种方法可以通过 JPA 工具从 Eclipse 中的数据库表生成实体,而不是手动创建实体。

      之后,您也可以将这些实体类用于弹簧数据。

      请参考link eclipse 帮助文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-06
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 2017-03-13
        • 2022-01-16
        相关资源
        最近更新 更多