开发者

Why does not jpa2/eclipselink generate on delete cascade SQL?

开发者 https://www.devze.com 2023-01-16 08:31 出处:网络
@Entity public class MUser implements Serializable, MemoEntity { private static final long serialVersionUID = 1L;

@Entity public class MUser implements Serializable, MemoEntity {

private static final long serialVersionUID = 1L;
@Id
private String email;

@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
private Set<Meaning> mengs = new HashSet<Meaning>();

Shouldn't this mean that I get the constraint with a "on delete cascade"?

This is what gets generated instead:

  CREATE TABLE MUSER_MEANING (MUser_EMAIL VARCHAR(255) NOT NULL, mengs_OBJID INTEGER NOT NULL, PRI开发者_如何学JAVAMARY KEY (MUser_EMAIL, mengs_OBJID))
CREATE TABLE MUSER_MEANING (MUser_EMAIL VARCHAR(255) NOT NULL, mengs_OBJID INTEGER NOT NULL, PRIMARY KEY (MUser_EMAIL, mengs_OBJID))
ALTER TABLE MEANING ADD CONSTRAINT MEANING_USR_EMAIL FOREIGN KEY (USR_EMAIL) REFERENCES MUSER (EMAIL)
ALTER TABLE MUSER_MEANING ADD CONSTRAINT MSRMEANINGMsrEMAIL FOREIGN KEY (MUser_EMAIL) REFERENCES MUSER (EMAIL)

I'm trying to make it as such that deleting a MUser deletes all Meanings associated to it.


Why does not jpa2/eclipselink generate on delete cascade SQL?

Because that's not how things work. Specifying a cascade=REMOVE means that the remove operation will be cascaded to entities by the JPA provider, not at the database level using a constraint.

Some providers do have extensions to use a cascade delete constraint at the database level instead of the regular mechanism. For example with Hibernate, you can specify:

@OnDelete(action=OnDeleteAction.CASCADE) on joined subclasses: use a SQL cascade delete on deletion instead of the regular Hibernate mechanism.

But I don't know if EclipseLink has something equivalent.

References

  • JPA 2.0 Specification
    • Section 3.2.3 "Removal"
  • Hibernate Annotations Reference Guide
    • 2.4. Hibernate Annotation Extensions
0

精彩评论

暂无评论...
验证码 换一张
取 消