2013-02-14 28 views
5

Tôi chỉ tự hỏi nếu có như vậy một cách mà tôi có thể có xây dựng bảng MySQL của tôi nhưJPA + Hibernate: Làm thế nào để xác định một hạn chế có ON CASCADE DELETE

ALTER TABLE `USERINFO` 
    ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE; 

Tuy nhiên, tôi chỉ nhận được điều này trong DDL của tôi khi ngủ đông ++ bắt đầu JPA để xây dựng bảng của tôi có "<property name="hibernate.hbm2ddl.auto" value="create" />"

ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`); 

Trong lớp học của tôi, tôi có những thiết lập chú thích,

// UserAcc.java 
@Entity 
@Table(name = "USERACC") 
public class UserAcc implements Serializable { 

private static final long serialVersionUID = -5527566248002296042L; 

@Id 
@Column(name = "USERID") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userId; 


@OneToOne(mappedBy = "userAcc") 
private UserInfo userInfo; 
.... 


public UserInfo getUserInfo() { 
    return userInfo; 
} 
public void setUserInfo(UserInfo userInfo) { 
    this.userInfo = userInfo; 
} 
... 

// UserInfo.java 
@Entity 
@Table(name = "USERINFO") 
public class UserInfo implements Serializable { 

private static final long serialVersionUID = 5924361831551833717L; 

@Id 
@Column(name = "USERINFO_ID", nullable=false) 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userInfoId; 

@OneToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name="USERID", nullable=false) 
@ForeignKey(name = "FK_USER_ID") 
private UserAcc userAcc; 


public Integer getUserInfoId() { 
    return userInfoId; 
} 

public void setUserInfoId(Integer userInfoId) { 
    this.userInfoId = userInfoId; 
} 
... 

Lưu ý rằng, UserAccount bảng là phụ huynh/table chính ở đây trong khi UserInfo là một bảng mở rộng bình thường để tổ chức khác. Mọi câu trả lời sẽ được đánh giá cao. Tôi chỉ tò mò làm thế nào nó được thực hiện như tôi thích làm việc cũng trong MySQL. Tôi chỉ thực sự được sử dụng để xóa một bản ghi từ bảng cha (USERACOUNT) mà cũng sẽ cho phép tôi để thác một xóa thông qua các hồ sơ con phụ thuộc vào hồ sơ cụ thể từ một bảng cha/tiểu học.

Cảm ơn!

+0

Bạn đã tìm thấy giải pháp cho vấn đề này bằng cách sử dụng jpa chưa? Tôi đang gặp vấn đề tương tự và tôi không muốn sử dụng một mối quan hệ hai chiều, tạo ra việc tìm nạp lười trên bố mẹ. –

Trả lời

5

JPA thực hiện khả năng cung cấp cho các hoạt động cascade (hợp nhất, kiên trì, làm mới, xóa) với các thực thể được liên kết. Logic là trong JPA và không sử dụng cơ sở dữ liệu thác.

Không có cách tuân thủ tiêu chuẩn JPA nào để thực hiện thác với chuỗi cơ sở dữ liệu. Nếu một thác như vậy được ưu tiên, chúng ta phải quay trở lại cấu trúc cụ thể Hibernate: @OnDelete. Nó hoạt động với @OneToMany ít nhất, nhưng trước đây từng có một số vấn đề trong quá khứ với @OneToOne và @OnDelete.

@OnDelete(action = OnDeleteAction.CASCADE) 
+1

Cảm ơn Mikko. Tôi đã thử bao gồm OnDelete với chú thích JPA, nó không hoạt động thực sự. Tôi có một câu hỏi, khi bạn muốn thao tác cơ sở dữ liệu của bạn và muốn thêm ON DELETE CASCADE, đặc biệt là MySQL, bạn xử lý nó như thế nào? – toytoy

5

Không có phương tiện cắt sạch để thực hiện điều này trong JPA. Sau đây sẽ giúp bạn có được những gì bạn muốn ... Bạn có thể sử dụng CascadeType.DELETE, tuy nhiên chú thích này chỉ áp dụng cho các đối tượng trong EntityManager, không phải cơ sở dữ liệu. Bạn muốn chắc chắn rằng ON DELETE CASCADE được thêm vào ràng buộc cơ sở dữ liệu. Để xác minh, bạn có thể cấu hình JPA để tạo một tệp ddl. Hãy xem tệp ddl, bạn sẽ nhận thấy rằng ON DELETE CASCADE không phải là một phần của ràng buộc. Thêm ON DELETE CASCADE vào SQL thực trong tệp ddl, sau đó cập nhật lược đồ cơ sở dữ liệu của bạn từ ddl. Điều này sẽ khắc phục sự cố của bạn.

Điều này link cho biết cách sử dụng ON DELETE CASCADE cho số CONSTRAINT trong MySQL. Bạn làm điều này trên ràng buộc. Bạn cũng có thể làm điều đó trong tuyên bố CREATE TABLE hoặc ALTER TABLE. Có khả năng là JPA tạo ra ràng buộc trong câu lệnh ALTER TABLE. Chỉ cần thêm ON DELETE CASCADE vào tuyên bố đó.

Lưu ý rằng một số người triển khai JPA cung cấp phương tiện cho chức năng này.

Cuối cùng, Hibernate cung cấp chức năng này bằng cách sử dụng chú thích OnDelete(action = OnDeleteAction.CASCADE).

1

Bạn có thể sử dụng Hibernate chú thích [email protected](action = OnDeleteAction.CASCADE) trên UserAcc.userInfo:

public class UserAcc implements Serializable { 

... 

@OneToOne(mappedBy = "userAcc") 
@OnDelete(action = OnDeleteAction.CASCADE) 
private UserInfo userInfo; 

... 

này sẽ tạo ra DDL ON DELETE CASCADE trên chính nước ngoài tại UserInfo bảng.

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