2012-01-09 32 views
10

về cơ bản, những gì tôi muốn làm là gán thuộc tính 'unitName' của @PersistenceContext với một giá trị mà tôi sẽ nhận được từ các phiên khi chạy.động @PersistenceContext unitName thuộc tính cho container dựa trên EntityManager

chi tiết;

đơn đăng ký của tôi sẽ là ứng dụng SaaS và tôi sẽ có các DB riêng biệt cho mọi người thuê khác nhau. Tôi đang sử dụng Glassfishv3 và quản lý các đối tượng dựa trên vùng chứa vì vậy tôi không nhận được bất kỳ cá thể nào từ EntityManagerFactory một cách rõ ràng. Tất cả những gì tôi đang làm để tạo ra một người quản lý thực thể là;

@PersistenceContext(unitName = "DBNAME") 
private EntityManager entityManager; 

tôi cần chuyển thuộc tính unitName theo người dùng hiện tại. nó không nên được mã hóa cứng.

Tôi đã cập nhật EclipseLink 2.3 nhưng tất cả những ví dụ đang tạo một thể hiện từ EMF mà bạn có thể vượt qua Bản đồ tài sản như

Map memberProps = new HashMap(); 
memberProps.put("memberPu1", props1); 
memberProps.put("memberPu2", props2); 

Map props = new HashMap(); 
props.put("eclipselink.jdbc.exclusive-connection.mode", "Always"); 
props.put("eclipselink.composite-unit.properties", memberProps); 

EntityManager em = emf.createEntityManager(props); 

khó trong ứng dụng của tôi, container làm việc đó vì vậy tôi đang không có khả năng làm điều này

EntityManager em = emf.createEntityManager(props); 

Mặc dù tôi có tất cả các đơn vị kiên trì và các lớp trong persistence.xml tôi bằng cách sử dụng định nghĩa JNDI, tôi không có khả năng t o nói với máy chủ ứng dụng mà DB (đơn vị bền vững) nó nên sử dụng đồng thời

bất kỳ trợ giúp sẽ được đánh giá cao

+0

Câu hỏi này giúp tôi tìm giải pháp cho trường hợp tương tự. Tôi có thể sử dụng: http://stackoverflow.com/questions/5104185/how-to-inject-persistence-context-to-different-data-source-programmatically – Monnie

Trả lời

9

giá trị trong các chú thích không thể được chỉ định khi chạy, và do đó bạn sẽ cần phải tìm một chiến lược, nơi bạn có thể tạo nhiều số PersistenceContext s. Nếu bạn có thể sử dụng CDI, nó có thể sẽ làm cho cuộc sống của bạn dễ dàng hơn.

Với CDI bạn có thể có thể tạo ra một nhà sản xuất như sau:

public class EntityManagerProducer { 

    @PersistenceContext(unitName="firstUnit") private EntityManager firstEntityManager; 
    @PersistenceContext(unitName="secondUnit") private EntityManager secondEntityManager; 

    @Produces 
    public EntityManager getEntityManager(InjectionPoint injectionPoint) { 
    if(<your_first_criteria>) { 
     return firstEntityManager; 
    } else if (<your_second_criteria>) { 
     return secondEntityManager; 
    } 
    } 

Sau đó, bạn có thể sử dụng phương pháp sản xuất của bạn trong ví dụ DAO của bạn:

@Inject private EntityManager entityManager; 

EDIT: Tôi có lẽ sẽ khuyên bạn nên sử dụng một chú thích @Qualifier vì nó làm cho nó rõ ràng có thì bạn nhận được EntityManager từ.

+0

bất kỳ ai sẵn sàng cập nhật mã mẫu bằng '@ Qualifier' được sử dụng? –

1

Bạn cần sử dụng đơn vị kiên trì được quản lý bởi ứng dụng chứ không phải vùng chứa.

ví dụ: Persistence.createEntityManagerFactory()

Bạn vẫn có thể sử dụng JTA, chỉ cần không tiêm.

+0

nó có vẻ như vậy với tôi nhưng tại thời điểm đó tôi sẽ phải đối phó với tất cả các vòng đời giao dịch trong ứng dụng của tôi mà không được thiết kế theo cách đó. dường như không có cách nào để cung cấp cấu hình trong thời gian chạy và để các hoạt động khác cho máy chủ ứng dụng nhưng cảm ơn vì đã trả lời –

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