在hibernate中连接不同数据库/ sessionfactory中的表

时间:2014-10-21 13:19:20

标签: java sql-server hibernate postgresql join

我的应用程序适用于2个数据库:1个SQL Server和1个PostgreSQL。 SQL Server用于网站,过去有一些性能问题,因此,我将一些分析数据分成不同的数据库,我不断添加数据并整天计算一些事情。

在大多数情况下,我单独使用数据库,但在一种情况下,我想加入来自不同数据库的两个表。

有什么方法可以用Hibernate做到这一点吗?

举个例子,我有两个简化的实体:Order和OrderSource。 Order表位于SQL Server中,OrderSource位于PostgreSQL中。 它们都可以自己正常工作,但是当我将OrderSource添加到实体OrderSource的实体Order和Order时,它显然出错了,因为它们试图访问在另一个SessionFactory中配置的数据库。

订单实体:

@Entity
@Table(name=DomainConstants.TB_ORDER, schema=DomainConstants.DB_SCHEMA) 
public class Order {

  @Id
  @Column(name="cod")
  @GeneratedValue
  private Long id;

  @OneToOne(mappedBy="order", fetch=FetchType.LAZY)
  private OrderSource orderSource;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public OrderSource getOrderSource() {
    return orderSource;
  }

  public void setOrderSource(OrderSource orderSource) {
    this.orderSource = orderSource;
  }
}

OrderSource实体:

@Entity
@Table(name=DomainConstants.TB_ORDER_SOURCE, schema=DomainConstants.DB_SCHEMA_GOOGLE)
public class OrderSource {

  @Id
  @Column(name="id")
  private long id;

  @Column(name="source")
  private String source;

  @Column(name="medium")
  private String medium;

  @OneToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="id")
  private Order order;

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getSource() {
    return source;
  }

  public void setSource(String source) {
    this.source = source;
  }

  public String getMedium() {
    return medium;
  }

  public void setMedium(String medium) {
    this.medium = medium;
  }

  public Order getOrder() {
    return order;
  }

  public void setOrder(Order order) {
    this.order = order;
  }

}

我能提出的一个解决方案是使用OrderDao和OrderSourceDao处理我的OrderService。 这样我就从每个实体中删除了映射,并创建了一个Service来获取所有Orders并迭代所有订单获取OrderSource。 然而,这并不像我想的那么快,我无法对数据进行分组或订购。

@Component   
public class OrderServiceImpl implements OrderService {

  private OrderDao orderDao;
  private OrderSourceDao orderSourceDao;

  @Autowired
  public OrderServiceImpl(OrderDao orderDao, OrderSourceDao orderSourceDao) {
    this.orderDao = orderDao;
    this.orderSourceDao = orderSourceDao;
  }

  public List<Order> getOrdersWithOrderSource() {
    List<Order> orders = this.orderDao.index(); // get all Orders

    for(Order order: orders)
        order.setOrderSource(this.orderSourceDao.findById(order.id)); // Find OrderSource by Order id
  }

}

有没有人遇到这样的事情?有没有人在不同的数据库上有这种连接的解决方案?

非常感谢大家!

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用SQL查询通过数据库链接加入表格,然后通过ResultSetHandler将其映射到实体(如果它仅用于查看目的)或基于此检索数据库中的ID集合你想在哪里进行更改,然后通过HQL和ID设置选择实体,这样你就可以将它们存储到你的主数据库中(我假设你想要更改数据的主数据库是网络数据而不是分析数据)?