避免DAO交叉访问

时间:2014-03-06 20:13:21

标签: java spring hibernate dao

我正在构建一个简单的Spring + Hibernate应用程序,我有以下模型:

 Link ( id, url, title )
 History ( link_id, report_time, number_of_likes )

在我的Main方法中,我有类似的东西:

    public static void main(String[] args) {

      ApplicationContext context =
                new ClassPathXmlApplicationContext(new String[] {"spring.xml"});
      ...

      ((LinkDao) context.getBean("linkDao")).updateAll(date);

      ...
    }

此应用每30分钟运行一次;进入 LINK 表格,并在 HISTORY 表格中记录当时Facebook喜欢的数量。

现在问题是我需要在位于 LinkDaoImpl 内的updateAll(Date date)方法中将记录插入 HISTORY 表中strong>但我无法从 LinkDaoImpl 访问 HistoryDaoImpl ,除非我将上下文传递给 < EM> LinkDaoImpl 即可。如果我包括:

 @OneToMany
 List<History> history

Inside Link模型,Hibernate创建了一个额外的 HISTORY_LINK 表,这是不必要的。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

您需要在mappedBy="link"中添加@OneToMany。当您使用关系@ManyToOne时,映射默认使用@JoinColumn,但在@OneToMany中您必须指定关系的所有者

答案 1 :(得分:0)

听起来你需要将linkDao.updateAll中包含的一些逻辑提取到服务类。服务类可以执行交叉模型工作,并让您的DAO只修改它们应该的表。然后将两个DAO注入服务类。

答案 2 :(得分:-1)

当您使用@O​​neToMany注释时,Hibernate将始终在实体关系之间创建一个新表,即使您没有看到它的实际用途。

所以,在这种情况下你应该尝试@OneToOne注释,或者只是接受Hibernate创建的新表。