2014-11-01 69 views
5

我以前使用过Hibernate,现在我正试图理解JDBC。我已经完成了Spring 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在数据库中正确保存产品和客户对象? 谢谢

+0

你不知道。您使用JPA框架。像Hibernate一样。 – 2014-11-01 11:09:39

+0

有没有办法使用Spring JDBC来做到这一点? – Bravo 2014-11-01 11:17:08

+0

有没有什么办法可以在汽车里穿越大西洋?是的,当然 - 建造一艘船并将汽车放在上面。或者你可以用一条船。 – 2014-11-01 11:17:59

回答

4

在很多情况下,不使用全面的ORM,而是依赖较低级别的抽象(如Spring JDBCTemplate和RowMapper),这有很多意义。 iBatis也可以想到。即使在大型企业解决方案中也是如此。

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

编写所有的数据更加混乱,特别是如果您需要优化未被污染的东西。

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

0

如果我正确理解你的问题,如果认为如果你不使用ORM,你将不得不手动执行此操作。 在客户的DAO类中,它首先必须保留所有产品。

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

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

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

+0

没有理由不能使用[带有ORM的存储过程](http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures)。 – 2014-11-01 12:12:55

+0

感谢鲍里斯,我不知道我是否知道,我会读一读它可能会有用:) – Gavin 2014-11-01 12:16:12

1

如果你愿意考虑春季和冬眠之外的其他东西,sormula可以做你所描述的。请参阅one to many示例。如果您将多边的外键命名为与一边的主键相同,那么您不需要任何注释。

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