2010-02-22 43 views
17

Tôi có một ứng dụng sử dụng Java servlets/JSP's. Có nhiều khách hàng sử dụng ứng dụng của tôi, tuy nhiên mỗi khách hàng có một cơ sở dữ liệu riêng biệt. Tất cả các cơ sở dữ liệu đều có cùng một lược đồ. Tôi muốn xác định kết nối cơ sở dữ liệu nào sẽ sử dụng vào thời điểm người dùng đăng nhập vào hệ thống.Làm cách nào để kết nối với nhiều cơ sở dữ liệu bằng JPA?

Ví dụ máy khách Một bản ghi, tôi xác định rằng máy khách A thuộc cơ sở dữ liệu C, lấy kết nối cho cơ sở dữ liệu C và tiếp tục theo cách vui vẻ của tôi.

Tôi đang sử dụng JPA với Hibernate làm nhà cung cấp JPA của mình. Có thể làm điều này bằng cách sử dụng nhiều đơn vị kiên trì và xác định đơn vị nào sẽ sử dụng tại thời điểm đăng nhập? Có một cách tốt hơn/ưa thích để làm điều này?

Chỉnh sửa để thêm: Tôi đang sử dụng chú thích và EJB để bối cảnh Persistence đang được đặt trong EJB với @PersistenceContext (unitName = "blahblah"), điều này có thể được xác định tại thời điểm đăng nhập không? Tôi có thể đổi tên unitName khi đang chạy không?

Cảm ơn

Trả lời

16

1) Tạo một số đơn vị liên tục trong persistence.xml với các tên khác nhau.

2) Tạo số cần thiết của EntityManagerFactory s (1 cho mỗi kiên trì đơn vị) và xác định kiên trì đơn vị nên được sử dụng cho nhà máy bê tông:

<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="SpringSecurityManager"/> 
</bean> 

3) Tạo số cần thiết của TransactionManager s:

<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="authEntityManagerFactory" /> 
</bean> 

4) Trong lớp học của DAO bạn chỉ định mà kiên trì đơn vị (và do đó mà EntityManagerFactory) bạn muốn làm việc:

public class AbstractAuthDao<T> { 

    @PersistenceContext (unitName = "SpringSecurityManager") 
    protected EntityManager em; 

    ... 
} 

5) Trong dịch vụ đối tượng của bạn xác định những TransactionManager nên được sử dụng (tính năng này chỉ được hỗ trợ trong mùa xuân 3.0):

@Transactional (value = "authTransactionManager", readOnly = true) 
public class UserServiceImpl implements UserService { 

    ... 
} 

6) Nếu bạn có OpenEntityManagerInViewFilter trong web.xml của bạn, sau đó xác định trong tên init-param của cần thiết EntityManagerFactory (hoặc tạo nhiều bộ lọc với phóng viên init-khối):

<init-param> 
    <param-name>entityManagerFactoryBeanName</param-name> 
    <param-value>authEntityManagerFactory</param-value> 
</init-param> 
+0

Ai nói OP được sử dụng Spring? :) –

+0

Tôi đã thực hiện đề xuất này trước khi câu hỏi được chỉnh sửa. – Roman

+0

Để công bằng, tôi chưa bao giờ đề cập đến Spring trong bài đăng gốc, bản chỉnh sửa chỉ thêm thông tin nhiều hơn, nhưng điều này dẫn tôi đến câu trả lời có vẻ như nó sẽ hoạt động, vì vậy nó đã được chấp nhận. – kgrad

Các vấn đề liên quan