2010-05-07 34 views
10

Tôi có một thành phần được ánh xạ bằng Hibernate. Nếu tất cả các trường trong thành phần trong cơ sở dữ liệu là null, thành phần chính nó được đặt thành null bằng cách ngủ đông. Đây là hành vi mong đợi và cũng là những gì tôi cần.bộ sưu tập rỗng ngủ đông trong thành phần

Vấn đề tôi có, là khi tôi thêm một túi vào thành phần đó, túi được khởi tạo vào danh sách trống. Điều này có nghĩa là thành phần có giá trị không null ... dẫn đến thành phần được tạo ra.

Bất kỳ ý tưởng nào về cách sửa lỗi này?

<class name="foo.bar.Entity" table="Entity"> 
<id name="id" column="id"> 
    <generator class="native" /> 
</id> 

<property name="departure" column="departure_time" /> 
<property name="arrival" column="arrival_time" /> 

<component name="statistics"> 
    <bag name="linkStatistics" lazy="false" cascade="all" > 
     <key column="entity_id" not-null="true" /> 
     <one-to-many class="foo.bar.LinkStatistics" /> 
    </bag> 

    <property name="loggedTime" column="logged_time" /> 

    ... 
</component> 

Một tiêu chí với Restirctions.isNull ("thống kê") không trả lại giá trị mong đợi.

+0

Vui lòng thêm thông tin về ngữ cảnh: Ai đặt thành phần đó thành rỗng? Thành phần bạn đang nói đến là gì? Đó là container? –

+0

Aaron, Hibernate rời khỏi thuộc tính thành phần (số liệu thống kê, trong lớp Entity) thành null. –

+0

Có vẻ là một vấn đề khá cũ nhưng tôi có nó là tốt và không thể tìm thấy bất kỳ giải pháp. Bạn có may mắn trong thời gian chờ đợi không? – Martin

Trả lời

0

tôi không thể xác minh điều này nhưng đây là một ý tưởng:

public void setListProperty(List list) { 
    if (list == null || list.size() == 0) { 
    this.listProperty = null; 
    } else { 
    this.listProperty = list; 
    } 
} 

Rõ ràng không lý tưởng nhưng có thể là một cách giải quyết cho bạn ...

+0

Cách tiếp cận này có thực sự phù hợp với bạn không? Từ kinh nghiệm của tôi thủ thuật trong setters dẫn đến ngoại lệ "bộ sưu tập khác đã được liên kết với phiên" trong Hibernate (vì Hibernate sẽ nhớ bộ sưu tập trống nó dự định liên kết với thực thể cha mẹ). Vì vậy, các mã ở trên sẽ làm việc khi thực thể trở thành tách ra (phiên nó đã được nạp với đã được đóng), nhưng sẽ thất bại khác. Sử dụng 'null' trong getter tốt hơn nhiều :) –

1

Vấn đề cơ bản ở đây là Hibernate không thể phân biệt giữa các bộ sưu tập rỗng và các bộ sưu tập rỗng, do đó, nó xử lý cả hai là rỗng: không rỗng.

Tôi đề nghị bạn thay đổi thành phần Thống kê thành một thực thể thực thay thế. Sau đó, lớp foo.bar.Entity của bạn có tham chiếu, có thể là null. Điều này không lý tưởng vì bạn sẽ phải tạo một bảng khác để lưu trữ thực thể Thống kê, nhưng nếu bạn muốn phân biệt ngữ nghĩa rỗng so với trống rỗng, đó là một cách để có được nó.

+0

Đúng. Khái niệm về bộ sưu tập không thực sự tồn tại trong RDBMS vì vậy Hibernate (hoặc bất kỳ ORM) phải làm gì đó *. –

0

Có thể điều này có thể hữu ích. Nó không giải quyết được vấn đề phân biệt giữa túi rỗng và rỗng nhưng đó là giải pháp thay thế. Như bạn có thể biết bạn có thể giới thiệu một kẻ đánh chặn đến phiên của bạn có thể chặn trong một số hành động như lưu hoặc cập nhật thực thể, bạn có thể sử dụng trình chặn này để kiểm tra trạng thái của thành phần của bạn và nếu nó trống rỗng không lưu các giá trị rỗng. here của tài liệu.

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