2009-05-08 36 views
10

Tôi đang cố gắng ánh xạ một mối quan hệ "không hoặc một" trong Hibernate. Tôi nghĩ rằng tôi có thể đã tìm thấy một cách sử dụng nhiều-một.Hibernate một đến số không hoặc một ánh xạ

class A { 
    private B b; 
    // ... getters and setters 
} 

class B { 
    private A a; 
} 

lập bản đồ Class A của quy định cụ thể:

<many-to-one name="b" class="B" 
insert="false" update="false" 
column="id" unique="true"/> 

và lập bản đồ Class B của quy định cụ thể:

<one-to-one name="a" class="A" constrained="true"/> 

Những gì tôi muốn là cho b để được null khi không có hàng phù hợp cho B được tìm thấy trong cơ sở dữ liệu. Vì vậy, tôi có thể làm điều này (trong lớp A):

if (b == null) 

Tuy nhiên, có vẻ như b không bao giờ là rỗng.

Tôi có thể làm gì về điều này?

+0

Tôi đang chờ câu trả lời – Schildmeijer

+0

"để trả lời" ofcourse – Schildmeijer

Trả lời

6

Câu trả lời là để thêm not-found = "bỏ qua" cho-to-one nhiều tuyên bố trong A:

<many-to-one name="b" class="B" not-found="ignore" insert="false" update="false" column="id" unique="true"/> 

Tôi đã cố gắng chỉ đơn giản là thêm lười biếng = "false" sang B như Rob H đề nghị, nhưng điều đó dẫn đến một mọi HibernateObjectRetrievalFailureException tôi nạp điểm A mà không có B.

Xem chủ đề này để biết thêm thông tin:

https://forum.hibernate.org/viewtopic.php?p=2269784&sid=5e1cba6e2698ba4a548288bd2fd3ca4e

+2

Cách sử dụng chú thích này? – Nik

0

Thử đặt lazy = "false" trên phần tử nhiều người. Điều đó sẽ buộc Hibernate cố gắng tìm nạp liên kết ("B") khi đối tượng đầu tiên ("A") được tải. Thuộc tính trong "A" sẽ được khởi tạo với một thực thể "B" hoặc null.

16

L ike Boden cho biết, câu trả lời là thêm not-found="ignore" đến-to-one nhiều tuyên bố trong A. Việc làm này với chú thích:

Trong Class A:

@ManyToOne 
@Cascade({ CascadeType.ALL }) 
@JoinColumn(name = "Id") 
@NotFound(action=NotFoundAction.IGNORE) 
private B b 

trong Class B:

@Id 
@GeneratedValue(generator = "myForeignGenerator") 
@org.hibernate.annotations.GenericGenerator(
    name = "myForeignGenerator", 
    strategy = "foreign", 
    parameters = @Parameter(name = "property", value = "a") 
) 
private Long subscriberId; 

@OneToOne(mappedBy="b") 
@PrimaryKeyJoinColumn 
@NotFound(action=NotFoundAction.IGNORE) 
private A a; 
Các vấn đề liên quan