【问题标题】:Object-mapping in Spring JDBC?Spring JDBC中的对象映射?
【发布时间】:2014-11-01 11:02:36
【问题描述】:

我以前使用过 Hibernate,现在我正在尝试了解 JDBC。我对 Spring JDBC 进行了大量研究,但仍然无法理解如何在对象之间创建关系。

假设我有一个产品:

public class Product {
private Long id;
private String nam;
private Customer customer;

//constructor, getters and setters.
}

和一位客户:

public class Customer {
private Long id;
private String name;
private List<Product> products = new ArrayList<Product>();

//constructor, getters and setters
}

客户和产品之间的关系是@OneToMany。 如何使用 SpringJDBC 正确地将产品和客户对象保存在数据库中? 谢谢

【问题讨论】:

  • 你没有。您使用 JPA 框架。像休眠一样。
  • 有没有办法使用 Spring JDBC 做到这一点?
  • 有什么方法可以开车穿越大西洋吗?是的,当然——造了一条船,把车放在上面。或者你可以只用一条船。
  • 复杂企业不是使用 ORM 构建的。这就是为什么我试图“造船横渡大西洋”
  • 是的。他们是。 ORM 用于您可以购买的几乎所有复杂的企业 Java 应用程序。如果你不想使用 ORM,那么你显然不会得到 ORM。

标签: java spring jdbc


【解决方案1】:

在很多情况下,不使用完整的 ORM 而是依赖较低级别的抽象(如 Spring JDBCTemplate 和 RowMapper)是很有意义的。 iBatis 也浮现在脑海中。即使在大型企业解决方案中,这也是有意义的。

如果您离开成熟的 ORM 世界,您将不得不自己做额外的工作。例如,您可以编写一个带有连接的 SQL 查询,返回该客户的所有客户字段和所有产品,并遍历它以将所有内容映射到 Java 对象。在相当多的情况下,代码可以像使用 ORM 一样干净。

编写所有这些数据更麻烦,尤其是当您需要针对未弄脏的内容进行优化时。

我能想到的最佳用例是批处理,其中对数据访问的控制变得更加重要,更高级别的抽象并不一定会让您更有效率。

【讨论】:

    【解决方案2】:

    如果你愿意考虑 spring 或 hibernate 以外的东西,sormula 可以做你描述的事情。请参阅one to many 示例。如果多方面的外键名称与一方面的主键名称相同,则不需要任何注释。

    要在多方对象(产品)中存储对单方对象(客户)的引用,您可以使用OneToManyCascade#foreignKeyReferenceField。例如,在项目中的测试中搜索“foreignKeyReferenceField”。

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,如果您不使用 ORM,则必须手动执行此操作。 在 Customer 的 DAO 类中,它首先必须持久化所有产品。

      另一种方法可能是在数据库上创建一个存储过程,并对其进行正确的持久性。
      这可以通过 Spring JDBC 很好地处理,缺点是您知道必须管理 Java 和存储过程。 在您的情况下,它可能仍然是两个存储过程。

      QueryDSL 和 Jooq 也有可能,以为我没有机会好好看看它们。

      我个人喜欢存储过程解决方案,对我来说额外的开销是值得的,我知道其他人不同意,但我只是不喜欢/购买 ORM 交易。

      【讨论】:

      • 没有理由不能使用stored procedures with ORM
      • 谢谢鲍里斯,我不确定我是否知道,我会读一读它可能会有用:)
      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 2016-12-18
      • 2017-02-17
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多