2008-10-28 20 views
11

Tôi có một cơ sở dữ liệu hiện có với bảng Giao dịch trong đó. Tôi đã thêm một bảng mới gọi là TransactionSequence, nơi mỗi giao dịch cuối cùng sẽ chỉ có một bản ghi. Chúng tôi đang sử dụng bảng tuần tự để tính các giao dịch cho một tài khoản nhất định. Tôi đã ánh xạ này như là một bản đồ một-một trong đó TransactionSequence có một khóa chính của TransactionId.NHibernate một-một bản đồ nơi dữ liệu bảng thứ hai có thể là null

Ràng buộc là có thay vì kích hoạt trên bảng giao dịch không cho phép cập nhật giao dịch bị hủy hoặc đăng.

Vì vậy, khi trình tự được tính toán và giao dịch được lưu, NHibernate cố gửi bản cập nhật về giao dịch như 'UPDATE Transaction SET TransactionId =? WHERE TransactionId =? '. Nhưng điều này không thành công vì kích hoạt. Làm thế nào tôi có thể cấu hình lập bản đồ của tôi để NHibernate sẽ không cố gắng cập nhật bảng giao dịch khi một bảng TransactionSequence mới được chèn vào?

giao dịch lập bản đồ:

<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true"> 
    <id name="Id" column="ID"> 
     <generator class="native" /> 
    </id> 

    <property name="TransactionTypeId" access="field.camelcase-underscore" /> 
    <property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" /> 

    <one-to-one name="Sequence" class="TransactionSequence" fetch="join" 
       lazy="false" constrained="false">  
    </one-to-one> 
</class> 

Và các bản đồ trình tự:

<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true"> 
    <id name="TransactionId" column="TransactionID" type="Int32"> 
     <generator class="foreign"> 
      <param name="property">Transaction</param> 
     </generator> 
    </id> 

    <version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" /> 

    <property name="SequenceNumber" not-null="true" /> 

    <one-to-one name="Transaction" 
       class="Transaction" 
       constrained="true" 
       foreign-key="fk_Transaction_Sequence" /> 

</class> 

Bất kỳ trợ giúp sẽ được đánh giá cao ...

Trả lời

15

Một với một ánh xạ trong nhibernate không làm việc theo cách bạn nghĩ. Nó được thiết kế sao cho bạn có hai lớp, mà khi tiếp tục với các bảng tương ứng của chúng có cùng các khóa chính.

Tuy nhiên bạn có thể làm cho nó hoạt động nhưng không đẹp. Tôi sẽ chỉ cho bạn cách sau đó cung cấp một số lựa chọn thay thế:

Trong hbml giao dịch của bạn:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/> 

Trong Chuỗi html của bạn:

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" /> 

này nên làm những gì bạn muốn nó làm. Lưu ý thuộc tính-ref.

Câu hỏi tiếp theo bạn sẽ đăng lên sẽ hỏi làm cách nào bạn tải xuống lười biếng trên các liên kết một-một. Câu trả lời là, bạn không thể ... tốt bạn có thể, nhưng nó có thể sẽ không hoạt động. Vấn đề là bạn có khóa ngoài của bạn trên bảng tuần tự, có nghĩa là nhibernate phải nhấn vào cơ sở dữ liệu để xem mục tiêu có tồn tại hay không. Sau đó, bạn có thể thử chơi xung quanh với ràng buộc = "true/false" để xem liệu bạn có thể thuyết phục nó lười biếng tải liên kết một-một.

Tất cả trong tất cả, nó sẽ dẫn đến tổng lãng phí thời gian của bạn.

Tôi đề nghị một trong hai:

  1. Có hai many-to-một hiệp hội.
  2. Có liên kết nhiều người với bộ sưu tập ở đầu bên kia.

Điều này sẽ giúp bạn tiết kiệm rất nhiều đau đầu về lâu dài.

+0

Bạn có ví dụ về cách sử dụng các liên kết 2 "nhiều người" không? Nguyên nhân một trong số họ cần sử dụng khóa ngoại của bảng kia. –

2

Chỉ ra rằng đối với trường hợp của tôi, bản đồ được làm việc tốt nhất là <join table>.Tôi chỉ phải đảm bảo rằng tôi đã tạo ra các thuộc tính đến từ bảng thứ hai là các loại nullable, hoặc nó sẽ làm một chèn vào lưu ngay cả khi không có gì thay đổi. Vì tôi không cần tải chậm cho bảng thứ hai, điều này hoạt động rất tốt. Tôi chắc chắn rằng tôi có thể có được ghép nối nhiều ánh xạ với nhau để làm việc, nhưng nó không trực quan và có vẻ phức tạp hơn so với tùy chọn bảng nối, tuy nhiên <join table> chỉ khả dụng trong NHibernate 2.0 trở lên.

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