2012-07-04 31 views
9

Tôi hiện đang di chuyển dự án của mình từ Hibernate HBM Mappings sang Annotations. Mọi thứ đều dễ dàng như tôi giải quyết với các lớp học nhỏ. Nhưng tôi có cùng một lớp học lớn và tôi cố gắng kết hợp cả ánh xạ và chú thích cho lớp này. Tôi đọc rằng điều này là có thể bằng cách sử dụng thuộc tính ngủ đông "hibernate.mapping.precedence" và đặt nó thành "class, hbm" thay vì "hbm, class". (Xem: In Hibernate: is it possible to mix Annotations and XML configuration for an Entity?)Hibernate: Di chuyển từ ánh xạ tới chú thích - có thể trộn hbm và chú thích không?

Ví dụ tôi có lớp sau Document:

@Entity 
@Table(name="DOCUMENT") 
public class Document { 
    @Column(name="DESCRIPTION") 
    private String description; 
} 

và file Document.hbm.xml sau:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping> 
    <class name="Document" table="DOCUMENT" > 
    <id name="id" column="DOCUMENT_ID" type="long" /> 
    </class> 
</hibernate-mapping> 

Trong file hibernate.cfg.xml của tôi Tôi đặt:

<property name="hibernate.mapping.precedence">class, hbm</property> 
<mapping class="Document"/> 
<mapping resource="Document.hbm.xml"/> 

Vấn đề của tôi là: - nếu tôi đặt "class, hbm "cho ưu tiên sau đó tôi có CHỈ chú thích của tôi trong tài liệu lớp - nếu tôi đặt" hbm, lớp "thì tôi CHỈ CHỈ ánh xạ của tôi trong hbm ressource

Có ai knwo nếu có một cách để có cả hai chú thích và Bản đồ HBM?

Cảm ơn

Kamran

PS: Tôi sử dụng: Hibernate 4.1.4 và Spring Framework 3.1.1

Trả lời

11

Bạn không thể kết hợp chúng cho cùng một lớp. Ở cuối section 1.2 of hibernate annotations:

Bạn có thể kết hợp các lớp liên tục được chú thích và khai báo hbm.cfg.xml cổ điển với cùng một SessionFactory. Tuy nhiên, bạn không thể khai báo một lớp nhiều lần (cho dù được chú thích hoặc thông qua hbm.xml). Bạn không thể kết hợp các chiến lược cấu hình (hbm vs chú thích) trong một hệ thống phân cấp thực thể.

Để dễ dàng quá trình di chuyển từ tệp hbm sang chú thích, cơ chế cấu hình phát hiện sự sao chép ánh xạ giữa các chú thích và tệp hbm. Các tệp HBM sau đó được ưu tiên hơn siêu dữ liệu có chú thích trên cơ sở lớp học. Bạn có thể thay đổi mức độ ưu tiên bằng cách sử dụng thuộc tính hibernate.mapping.precedence. Mặc định là hbm, class, thay đổi nó thành class, hbm sẽ ưu tiên các lớp được chú thích trên các tệp hbm khi xảy ra xung đột.

Sử dụng chú thích và tệp hbm đang khai báo lớp hai lần. Do đó, người ta sẽ được ưu tiên hơn so với người kia trong một lớp học cơ sở lớp (cơ sở lớp đến lớp nghĩa là mỗi lớp, chỉ có tệp hbm hoặc các chú thích được sử dụng).

+0

Kính gửi Pablo, cảm ơn rất nhiều về việc làm rõ này. ! – marcam

+0

Dude rất hữu ích –

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