2013-04-25 15 views
8

Tôi có một dự án JavaEE sử dụng nhiều đơn vị liên tục. Có cách nào để xác định đơn vị bền vững nào mà một thực thể JPA cụ thể thuộc về? Một số thực thể nằm trong một nguồn dữ liệu, trong khi các thực thể khác nằm trong nguồn dữ liệu thứ hai của tôi. Có cách nào để phân biệt giữa hai bằng cách sử dụng chú thích không?Thực thể JPA - Chỉ định Đơn vị Persistence?

Trả lời

7

Để xác định kiên trì đơn vị một Entity thuộc về, sử dụng persistence.xml file:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="user" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/myApp</jta-data-source> 
     <class>com.company.User</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <!-- properties --> 
     </properties> 
    </persistence-unit> 

    <persistence-unit name="data" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/myApp_data</jta-data-source> 
     <!--<mapping-file>META-INF/myApp_entities.xml</mapping-file> You can also use mapping files.--> 
     <class>com.company.Data</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <!-- properties --> 
     </properties> 
    </persistence-unit> 
</persistence> 

Lưu ý việc sử dụng <exclude-unlisted-classes />.

+0

Vì vậy, điều này sẽ yêu cầu tôi thêm mọi thực thể vào persistence.xml, thay vì sử dụng chú thích để khám phá, đúng không? – Shadowman

+0

Có. Về cơ bản, để có một sự lựa chọn giữa các bối cảnh bền vững, bạn sẽ cần phải liệt kê tất cả các lớp trong mỗi persistence.xml, OR liệt kê ngữ cảnh persistence trong mỗi thực thể. Cả hai dường như cùng một lượng công việc. Tuy nhiên, với lần đầu tiên, tất cả siêu dữ liệu ở một nơi duy nhất. – Kevin

+0

Ngoài ra, tôi không biết rằng phương pháp thứ hai (liệt kê các ngữ cảnh liên tục trong các thực thể) là có thể. – Kevin

0

Ngoài ra, bạn có thể xác định từ đơn vị liên tục mà một thực thể thuộc về bằng cách xác định EntityManager đã đăng ký nó.

Một thực thể được quản lý thuộc về ngữ cảnh kiên trì và bối cảnh liên tục thuộc về một đơn vị lưu giữ lâu dài. Vì vậy, trong ví dụ này:

@PersistenceContext(unitName="persistence-unit-1") 
EntityManager em1; 

@PersistenceContext(unitName="persistence-unit-2") 
EntityManager em2; 

em1.persist(entity1); 
em2.persist(entity2); 

entity1 thuộc về persistence-unit-1 và entity2 thuộc về persistence-unit-2. Nó không rõ ràng như chỉ định các thẻ < lớp > trong persistence.xml, nhưng bạn có thể có cùng các lớp thực thể trong cả hai đơn vị liên tục và vẫn phân biệt với đơn vị thực thể nào mà mỗi thực thể thuộc về.

+0

Vì vậy, làm thế nào bạn đã xác định rằng entity1 thuộc về persistence-unit-1, nếu bạn không xác định nó với các thẻ trong persistence.xml? – badera

+0

@badera khi triển khai ứng dụng vào một vùng chứa JEE đầy đủ như Weblogic, JBoss hoặc Webshpere, máy chủ ứng dụng sẽ tự động quét các lớp được chú thích bằng "Entity", bạn không cần thêm các thẻ để duy trì. xml giống như bạn làm khi sử dụng một thùng chứa servlet như Tomcat hoặc một ứng dụng java độc lập, hãy unles bạn sử dụng thẻ "exclude-unlisted-classes". – German

+0

Tôi biết. nhưng làm thế nào mà nó biết được, nó thuộc về 'persistence-unit' nào? Nhìn câu trả lời abouve ... – badera

2

Có thể sử dụng được @PersistenceUnit (tôi chưa thử)

ví dụ:

@PersistenceUnit(unitName="persistenceUnit2") 
@Entity 
class XPTO { 
} 

Từ Javadoc (http://docs.oracle.com/javaee/6/api/javax/persistence/PersistenceUnit.html)

"Bày tỏ sự một sự phụ thuộc vào một EntityManagerFactory và liên đơn vị bền vững của nó."

unitName (Tùy chọn) Tên của đơn vị lưu giữ như được xác định trong tệp persistence.xml.

+0

Ai đó có thể xác nhận rằng tính năng này hoạt động không? Tôi có các thực thể khác nhau mà tôi muốn gán cho hai PersistentUnits khác nhau - không có 'exclude-unlisted-classes = true' – badera

+0

@badera: Tôi đã không sử dụng nó, tôi biết nó tồn tại nhưng cuối cùng tôi không bao giờ cần nó. Không có gì giống như một thử nghiệm nhanh chóng tôi đoán :) –

+0

Vâng, tôi đã thử nghiệm nó và nó đã không hoạt động [xin lỗi, tôi đã không đề cập đến nó trong bình luận :)]. Vì vậy, tôi tự hỏi nếu tôi đã làm điều gì đó sai hoặc nó thực sự không hoạt động. Tôi vẫn sẽ vui vì một giải pháp, nơi tôi có thể chú thích từng thực thể, mà 'PersistenceUnit' (một hoặc nhiều) chúng thuộc về mà không liệt kê tất cả các lớp thực thể trong persistence.xml ... điều này gây phiền nhiễu cho vài trăm thực thể ... thậm chí ít hơn. – badera