2009-05-03 38 views
5

Tôi có mối quan hệ một-một giữa lớp Công ty và lớp Công tyCài đặt. Khi tôi tạo ra một đối tượng công ty mới, (một đối tượng CompanySettings được tạo ra trong constructor của Công ty đối với tài sản Cài đặt của nó), và sau đóNHibernate, ánh xạ một đối một, ghép tầng

SaveOrUpdate(session, companyObject) 

tôi hy vọng các INSERT để thác từ Công ty đến CompanySettings. Tuy nhiên, điều này không xảy ra trừ khi tôi gọi một cách rõ ràng SaveOrUpdate trên đối tượng CompanySettings.

file Mapping hiển thị dưới đây:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`> 
    <class name="AST.Domain.Company, AST.Domain" table="Companies"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="CompanyName" /> 
    . . . 
    <one-to-one name="Settings" class="AST.Domain.CompanySettings, AST.Domain" 
       constrained="true" lazy="false" /> 
    </class> 
</hibernate-mapping> 

tập tin bản đồ của tôi cho lớp Công ty Cài đặt:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="AST.Domain.CompanySettings, AST.Domain" table="CompanySettings"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="foreign"> 
     <param name="property">Company</param> 
     </generator> 
    </id> 
    <property name="MaxUsers" /> 
    <one-to-one name="Company" class="AST.Domain.Company, AST.Domain" /> 
    </class> 
</hibernate-mapping> 

Trả lời

5

Bạn đã cố gắng xác định cascade="all" trên bản đồ one-to-one của bạn?

2

Đặt thuộc tính xếp tầng của một đối một trong bản đồ Công ty.

Nhưng, trên một lưu ý khác: Bạn có nghĩ đến việc lập bản đồ các cài đặt của Công ty dưới dạng 'thành phần' của Công ty thay vì một thực thể riêng biệt không?

Không phải là 'Công tySettings' là 'đối tượng giá trị' và phải được ánh xạ tốt hơn như một thành phần?

Bằng cách thực hiện việc này, bạn có thể đặt giá trị CompanySettings trong cùng bảng với 'Công ty', nhưng nó sẽ được coi là một lớp riêng biệt.

Vì đây là một bản đồ một-một, tôi nghĩ rằng đó là một lựa chọn tốt hơn cho mô hình dữ liệu của bạn.

Sau đó, lập bản đồ của bạn sẽ trông như thế này:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`> 
    <class name="AST.Domain.Company, AST.Domain" table="Companies"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="CompanyName" /> 
    . . . 
    <component name="Settings" class="AST.Domain.CompanySettings, AST.Domain"> 
     <property name="MaxUsers" /> 
    </component> 
    </class> 
</hibernate-mapping> 

Bạn sẽ phải thực sự 2 đối tượng riêng biệt (Công ty & CompanySettings, và Công ty sẽ có một đối tượng 'Companysettings', nhưng các thiết lập sẽ được lưu trong bảng Công ty).

Hoặc, có lý do đặc biệt nào về lý do bạn đặt Công ty vào một bảng riêng biệt không? Tôi có nghĩa là, nó là một mối quan hệ một-một, do đó, điều này là hoàn toàn không cần thiết (và thậm chí là một thực hành xấu :)).

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