我的应用程序适用于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
}
}
有没有人遇到这样的事情?有没有人在不同的数据库上有这种连接的解决方案?
非常感谢大家!
答案 0 :(得分:0)
您是否考虑过使用SQL查询通过数据库链接加入表格,然后通过ResultSetHandler将其映射到实体(如果它仅用于查看目的)或基于此检索数据库中的ID集合你想在哪里进行更改,然后通过HQL和ID设置选择实体,这样你就可以将它们存储到你的主数据库中(我假设你想要更改数据的主数据库是网络数据而不是分析数据)?