2012-02-25 30 views
7

Tôi có một câu hỏi chung về Hibernate mà tôi đang chiến đấu với.Hibernate Cascade PERSIST

Tôi có lớp A và lớp B, trong đó B là phụ thuộc vào Một

Trong mã của tôi khi tôi gọi em.persist (objOfTypeA) Tôi mong chờ chèn để đi và chèn vào cả hai bảng AAA và BBB. Nếu tôi tự presist A có được một ID và điền vào nó trong danh sách cho từng đối tượng và sau đó vẫn tồn tại danh sách đó, mọi thứ đang làm việc. Nhưng tôi hy vọng điều này sẽ xảy ra kỳ diệu bởi Hibernate.

Tôi có làm gì sai không? Hoặc tôi chỉ mong đợi quá nhiều Hibernate?

Cảm ơn

@Entity 
@Table(name = "AAA") 
@Veto 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "Id") 
    private Long id; 


    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    ... 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    private List<B> b; 
... 
} 

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId") 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false) 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

Trả lời

1

Cuối cùng tôi đã làm việc đó. Không ai trong số những ví dụ tôi đã được đưa ra hoặc phát hiện nói với tôi chính xác những gì đã sai, đó là chỉ sau khi thử nghiệm của riêng tôi mà tôi quản lý để đi đến kết luận này:

Thay vì phải

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
private List<B> b; 

rằng didn' t làm việc (FK vẫn đến như NULL)

này công việc đã làm:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
@JoinColumn(name="AId") 
@NotNull 
private List<B> b; 
+0

Điều này không hiệu quả đối với tôi. Vấn đề là Hibernate muốn A được thiết lập trên B trước khi bền bỉ. Điều này đã làm việc: http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship –

0

Sửa đổi các bản đồ của lớp B như dưới đây,

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId", updatable = false, insertable = false) 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id") 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

Bạn đang sử dụng các thuộc tính updatable = false, insertable = false tại địa điểm sai và tôi đã sửa chữa nó.

Đọc here để hiểu cách chúng hoạt động.

+0

Hi ManuPK, Cám ơn bạn câu trả lời, nhưng điều này không giải quyết được vấn đề của tôi. Trong khi cố gắng duy trì (A) Tôi nhận được một lỗi rằng aId cho B là null. ConstraintViolationImpl {interpolatedMessage = 'có thể không được null', propertyPath = AID, rootBeanClass = lớp com.test.model.B, messageTemplate = '{} javax.validation.constraints.NotNull.message'} Tôi không chắc chắn nếu ở phía máy chủ SQL, tôi phải có cả hai id (A's và B's) là danh tính hoặc Hibernate sẽ quan tâm đến điều đó? Nhưng tôi giả định đó là ok vì nó không phàn nàn rằng nó phàn nàn về FK. – WonkeyDonkey

+0

DB đang tìm kiếm như thế này: Table1: AAA Id bigint không null, Tên varchar (100) Table2: BBB Id bigint không null, Aid bigint không null, Tên varchar (100) Cảm ơn! – WonkeyDonkey

+0

Tôi quay trở lại DB và gỡ bỏ 'không null' từ AId và cũng là @NotNull từ aId trong lớp B. Bây giờ tồn tại là thành công Nhưng khi tôi nhìn vào DB. AAA là tất cả tốt, nhưng BBB là thiếu AId. Trợ giúp .. – WonkeyDonkey

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