2013-03-21 22 views
5

Tôi có một đối tượng bất biến là thành viên của đối tượng Hibernate được lưu giữ lâu bền bằng cách sử dụng ánh xạ thành phần. Ví dụ, PinDrop tương ứng với một bảng, trong đó có một lĩnh vực loại bất biến Point:Lập bản đồ thành phần Hibernate của một đối tượng bất biến

public class PinDrop { 
    private String name; 
    private Point location; 
    // Getters and setters for name and location 
} 

// Immutable Point 
public class Point { 
    private final double x; 
    private final double y; 
    // Getters for x and y, no setters 
} 

Trong PinDrop.hbm.xml tôi:

<property name="name" column="name" type="string"/> 
<component name="location" class="Point> 
    <property name="x" column="location_x" type="double"/> 
    <property name="y" column="location_y" type="double"/> 
</component> 

này không làm việc vì ở Hibernate runtime phàn nàn rằng Point không có người định cư cho xy. Có cách nào để sử dụng một đối tượng bất biến như là một thành phần của một đối tượng bền vững Hibernate?

Theo dõi: Tôi không sử dụng chú thích, mà là hbm.xml. Không phải mutable cũng không phải immutable là các thuộc tính hợp lệ trên componentproperty trong hbm.xml.

+0

Bạn có cần đặt trường 'final'? –

Trả lời

5

Bạn có thể yêu cầu ngủ đông để sử dụng truy cập trường (thuộc tính access=field trong hbm của bạn) vì vậy hibernate sẽ không phàn nàn về các trình truy cập bị thiếu.

Phản chiếu sử dụng Hibernate để sửa đổi các trường cuối cùng để nó hoạt động.

+3

Tôi không tin rằng điều này sẽ làm việc, nhưng nó không. Rõ ràng các lĩnh vực cuối cùng có thể được sửa đổi bằng cách sử dụng sự phản ánh. Tôi tự hỏi điều gì có liên quan với mô hình bộ nhớ Java, vì các trường cuối cùng được đảm bảo là luồng an toàn và hiển thị đúng đối với tất cả các luồng. –

1

Bạn đã thử với chú thích @Immutable?

Đánh dấu một thực thể hoặc Bộ sưu tập là bất biến. Không có chú thích có nghĩa là phần tử có thể thay đổi.

Thực thể không thay đổi có thể không được ứng dụng cập nhật. Các cập nhật cho một thực thể bất biến sẽ bị bỏ qua, nhưng không có ngoại lệ nào được ném. @Immutable chỉ được sử dụng cho các thực thể gốc.

@Không thể đặt trên bộ sưu tập khiến bộ sưu tập không thay đổi được, nghĩa là việc thêm và xóa vào và ra khỏi bộ sưu tập không được phép cho phép. Một HibernateException được ném trong trường hợp này.

Theo như tôi biết để làm bảng không thay đổi trong thuộc tính * .hbm.xml, mutable="false" có thể giúp ích.

+0

Tôi sẽ dán điều này vào tệp 'hbm.xml' ở đâu? –

+0

Bảng không phải là bất biến, mà là thành phần –

3

Hibernate không thực sự thích các đối tượng bất biến. lựa chọn tốt nhất của bạn là một trong hai

  • Sử dụng đối tượng giả bất biến mà không sử dụng các từ khóa final, nhưng điều đó không có setters, và sau đó nói cho Hibernate để thiết lập giá trị thông qua các lĩnh vực.
  • Có hibernate populate đối tượng builder mutable, và sau đó có bản sao các thuộc tính của nó thành một đối tượng bất biến thích hợp. Thật không may, điều này có nghĩa là có hai lớp cho mỗi BO/DTO.
+0

Tôi thích tùy chọn đầu tiên này tốt hơn so với thiết lập các trường cuối cùng thông qua sự phản ánh. Việc đặt trường cuối cùng quá kỳ lạ và, như Steve đã nhận xét, có thể gây rối với các giả định an toàn chủ đề hợp lệ khác. – David

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