2013-03-08 27 views
8

tôi có 2 lớp gọi PurchaseList.java và PurchaseListItems.javaHibernate OnetoMany, ManyToOne Mapping Giving rỗng

tôi phải lập bản đồ PurchaseList trong PurchaseListItems

PurchaseList.java

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="pl_id",referencedColumnName="id") 
private List<PurchaseListItems> purchaseListItems; 

PurchaseListItems.java

@ManyToOne 
@JoinColumn(name="pl_id") 
private PurchaseList purchaseListId; 

Mọi thứ đều ổn nhưng tôi nhận được giá trị rỗng trong pl_id. Vui lòng cho biết tôi đang ở đâu sai

+0

JPA không quản lý quan hệ hai chiều. Bạn phải tự thiết lập quan hệ nghịch đảo. Cũng lưu ý rằng ánh xạ của bạn xác định hai quan hệ đơn hướng độc lập. Xem giải thích của tôi dưới đây – bennidi

Trả lời

5

Lập bản đồ của bạn thực sự xác định hai quan hệ một chiều độc lập. Những gì bạn muốn là một trong relation.The hai chiều mã sau đây sẽ thiết lập mối quan hệ hai chiều

@OneToMany(cascade = CascadeType.ALL, mappedBy = "purchaseListId") 
@JoinColumn(name="pl_id",referencedColumnName="id") 
private List<PurchaseListItems> purchaseListItems; 

Thuộc tính mappedBy là cần thiết vì không có cách nào cho nhà cung cấp để tự động xác định rằng các mối quan hệ cụ thể thực sự tạo thành một mối quan hệ duy nhất. Người ta có thể sử dụng kiểu Java của thành viên cá thể nhưng sau đó nếu bạn có nhiều thành viên cùng loại. Và có rất nhiều kịch bản mà bạn có hai quan hệ đơn lẻ. Ví dụ:

OneToMany: User -> ForumThread (các chủ đề được tạo ra bởi người sử dụng)

ManyToOne: ForumThread -> Người dùng (. Người sử dụng người đóng thread rõ ràng là không nhất thiết phải là một trong những người bắt đầu thread)

Đây là hai mối quan hệ độc lập và phải được xử lý như vậy. Bạn sẽ khá ngạc nhiên nếu sự kiên trì của bạn cung cấp một mối quan hệ hai chiều từ đó chỉ vì các loại và sự đa dạng phù hợp. Cũng lưu ý rằng quan hệ hai chiều không được quản lý tự động bởi bất kỳ nhà cung cấp JPA nào, có nghĩa là mặt nghịch đảo không được tự động cập nhật/thiết lập trong mô hình đối tượng của bạn và do đó không có trong db. Bạn phải tự mình làm điều đó. Nhân tiện, trong tất cả các dự án của tôi, các mối quan hệ hai chiều là một nỗi đau trong mông và tôi nghĩ rằng nên tránh chúng.

+6

Với hibernate4 (không chắc chắn về ver trước đó) mappedby và JoinColumn không thể sử dụng cùng nhau. – Chandru

+0

Tôi có cùng trải nghiệm với https://stackoverflow.com/users/1047493/bennidi. Nếu tôi sẽ tránh các mối quan hệ hai chiều và lấy mọi thứ "thủ công". Tôi đã hoàn thành hai ba lần nhanh hơn. – hariprasad

0

Đặc tả jpa có vẻ tốt, nhưng xác minh bạn đã cung cấp mối quan hệ cha mẹ hợp lệ cho con trong cơ sở dữ liệu. Nếu không có tham chiếu thì nó sẽ trả về null.

0

thử này

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId") 
0

Kiểm tra xem bạn đã cư purchaseListId với giá trị hợp lệ (một tạo PurchaseList chẳng hạn) khi bạn tạo một giá trị PurchaseListItems.

Tốt hơn nên sử dụng ánh xạBởi dưới dạng mã để cho phép nhiều bên duy trì mối quan hệ.

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "purchaseListId") 
@JoinColumn(name="pl_id",referencedColumnName="id") 
private List<PurchaseListItems> purchaseListItems; 
+0

Không, Henry không hoạt động, những gì bạn đã nói ở trên. Tôi đang thiếu cái gì đó mà tôi không biết. –

+0

@sainath Bạn có thể giải thích ý của bạn bằng "Mọi thứ đều ổn nhưng tôi nhận được null trong pl_id."? bạn có nghĩa là pl_id là null trong cơ sở dữ liệu hoặc trong trường hợp PurchaseListItems nạp của bạn? –

+0

Trong cơ sở dữ liệu tại thời điểm chèn nó phải lấy id từ Purchases và nó phải thay thế cho pl-id. Nhưng thay vì điều này nó là tiết kiệm null. –

0
for(PurchaseListItems item:purchaseListItemsList) 
item.purchaseListId(PurchaseList); 

Đây là những gì tôi đã bỏ lỡ khi tôi đang tạo ra một đối tượng.

Thnaks cho câu trả lời của bạn

0
  1. Chú thích @JoinColumn thuộc về phía @ManyToOne của mối quan hệ - nhưng không phải ở phía bên @OneToMany - loại bỏ nó từ phía @OneToMany.

  2. Cascade được sử dụng để xếp các hoạt động DELETE/READ/UPDATE ..., nhưng nó không tự động điền cột ID ở bên "con" của khóa ngoại. Trong thực tế, nó không điền các tham chiếu java vào các đối tượng ở hai bên của mối quan hệ FK. Bạn cần phải thiết lập dữ liệu quan hệ theo cách thủ công trên cả hai mặt của các mối quan hệ hai chiều:

    myPurchaseListItem.setPurchaseList (myPurchaseList);
    myPurchaseList.setPurchaseListItem (myPurchaseListItem);

    Từ JPA 2 spec:

    mối quan hệ hai chiều giữa các đơn vị quản lý sẽ được tiếp tục tồn dựa trên tài liệu tham khảo được tổ chức bởi các bên sở hữu của mối quan hệ. Trách nhiệm của nhà phát triển là giữ cho các tài liệu tham khảo trong bộ nhớ được tổ chức ở bên sở hữu và các tài liệu được giữ ở mặt trái phù hợp với nhau khi chúng thay đổi. Trong trường hợp các mối quan hệ một chiều và một-một-một chiều, trách nhiệm của nhà phát triển là đảm bảo (sic) rằng ngữ nghĩa của các mối quan hệ được tuân thủ.Điều đặc biệt quan trọng là phải đảm bảo rằng các thay đổi đối với mặt nghịch đảo của kết quả mối quan hệ trong các bản cập nhật thích hợp ở phía sở hữu, để đảm bảo các thay đổi không bị mất khi chúng được đồng bộ hóa với cơ sở dữ liệu.

1

Đối với một số lý do ánh xạ bởi không làm việc cho tôi với postgres sql và Hibernate4

Dưới đây lập bản đồ làm việc

PurchaseList.java

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="pl_id",nullable=false) 
private List<PurchaseListItems> purchaseListItems; 

PurchaseListItems.java

@ManyToOne 
@JoinColumn(name="pl_id", nullable=false,insertable=false,updatable=false) 
private PurchaseList purchaseListId; 

Lưu ý: bạn phải sử dụng Danh tính hoặc Đề cập rõ ràng Trình tự cho các cột id cho postgres.

@GeneratedValue(strategy=GenerationType.IDENTITY) 
+0

Bên trong bảng giá trị cột tham gia là nhận được cập nhật nhưng trong đối tượng thực thể tôi cũng nhận được giá trị là null –

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