2012-01-12 38 views
14

Tôi cần một mối liên hệ giữa hai thực thể, vì vậy tôi sử dụng một one-to-oneHibernate one-to-one, Không liên tiếp với các định danh cho tồn tại ngoại lệ

@Entity 
@Table(name = "T_USER") 
public class User implements Serializable { 

    @Id 
    @Column(name = "user_id") 
    private int userId; 

    @Column(name = "login") 
    private String login; 

    @OneToOne(optional = true)  
    @JoinColumn(name="login", referencedColumnName="person_id", nullable = true, insertable = false, updatable = false) 
    private Person person; 
} 

@Entity 
@Table(name = "T_PERSON") 
public class Person implements Serializable { 
    @Id 
    @Column(name = "person_id") 
    private String personId; 

    @Column(name = "pin") 
    private String pin; 
} 

Nếu không có mục cho một particulary PERSON trong bảng T_USER, user.getPerson ném một ngoại lệ:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [packagename.com.entity.Person#scabriou] 

Nhưng nếu tôi có tham chiếu giữa 2 bảng trong db, công cụ getter hoạt động!

+2

Điều gì, chính xác, là câu hỏi của bạn? – mcfinnigan

+0

Tôi không muốn có ngoại lệ khi tôi gọi user.getPerson nếu không có tham chiếu nào trong bảng người dùng cho người dùng. Tôi cần phải kiểm tra nếu user.getPerson không phải là null Tôi muốn user.getPerson(). GetPin(). – BasicCoder

+0

không có trên một đọc, chọn. – BasicCoder

Trả lời

29

Tôi không thể nói nếu đây là giải pháp tốt nhất nhưng bạn có thể sử dụng chú thích @NotFound. Ví dụ.

@NotFound(action = NotFoundAction.IGNORE) 
private Person person; 

Tôi tin rằng người này sẽ vẫn là null và ngoại lệ sẽ không được ném.

+0

wouaw, cảm ơn, tôi chưa từng thấy chú thích. Nó hoạt động! Bây giờ, giải pháp tốt nhất của nó ...? Bình thường, tôi biết là tốt hơn để sử dụng một-một trong những khóa chính nhưng trong trường hợp này tôi sẽ sử dụng một cách khác với chú thích @NotFound. – BasicCoder

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