2013-02-14 78 views
5

我只是想知道是否有这样我可以有建立我的MySQL表作为JPA + Hibernate的:如何界定具有ON DELETE CASCADE

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

不过,我只得到了这个在我的DDL的方式约束当Hibernate ++ JPA开始建设有 “<property name="hibernate.hbm2ddl.auto" value="create" />

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

在我的班级我的表,我有这些注释的设置,

// 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; 
} 
... 

需要注意的是,UserAccount表是父/主表在这儿的UserInfo是一个扩展表正常化另一个实体。任何答案将不胜感激。我只是好奇它是如何完成的,因为我喜欢在MySQL中工作。我真的很习惯从父表中删除记录(USERACOUNT),这也将允许我级联删除通过子记录,这取决于来自父/主表的特定记录。

谢谢!

+0

您是否使用jpa找到了解决此问题的解决方案?我遇到了同样的问题,我不想使用双向关系,从而在父级上创建延迟抓取。 – 2013-11-19 09:39:04

回答

5

JPA确实为cascade操作(合并,持续,刷新,移除)提供了关联实体的可能性。逻辑在JPA中,不使用数据库级联。

没有符合JPA标准的方法来执行数据库级联级联。如果这样的级联是首选的,我们必须回到Hibernate的特定结构:@OnDelete。它至少可以和@OneToMany一起工作,但过去使用@OneToOne和@OnDelete出现了一些问题。

@OnDelete(action = OnDeleteAction.CASCADE) 
+1

谢谢Mikko。我试着用JPA注释包含OnDelete,但它确实无法工作。我有一个问题,当你想操纵你的数据库并想添加ON DELETE CASCADE,特别是MySQL时,你如何处理它? – toytoy 2013-02-17 09:30:58

5

在JPA中没有干净的切割手段。以下将为您提供您想要的内容... 您可以使用CascadeType.DELETE,但此注释仅适用于EntityManager中的对象,而不适用于数据库。你想确保ON DELETE CASCADE被添加到数据库约束。要验证,您可以配置JPA生成一个ddl文件。看看ddl文件,您会注意到ON DELETE CASCADE不是约束的一部分。将ON DELETE CASCADE添加到ddl文件中的实际SQL中,然后从ddl更新数据库架构。这将解决您的问题。

link显示了如何在MySQL中使用ON DELETE CASCADE作为CONSTRAINT。你在约束上做到这一点。您也可以在CREATE TABLEALTER TABLE声明中执行此操作。 JPA很可能在ALTER TABLE声明中创建约束。只需在该语句中添加ON DELETE CASCADE即可。

请注意,某些JPA实现者提供了此功能的一种手段。

最后,Hibernate使用OnDelete(action = OnDeleteAction.CASCADE)注释提供此功能。

1

您可以在UserAcc.userInfo使用Hibernate注解[email protected](action = OnDeleteAction.CASCADE)

public class UserAcc implements Serializable { 

... 

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

... 

这将在UserInfo表生成DDL ON DELETE CASCADE外键。