【问题标题】:Why doesn't Eclipselink generate the ON DELETE CASCADE clause in a unidirectional @ManyToOne relationship?为什么 Eclipselink 不在单向 @ManyToOne 关系中生成 ON DELETE CASCADE 子句?
【发布时间】:2014-08-01 15:01:10
【问题描述】:

这是 Eclipselink JPA 中的两个相关实体:

@Entity
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

}

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;

    private String lastName;

    @ManyToOne(cascade={CascadeType.ALL})
    private Department department;

}

这是生成的 DDL:

CREATE TABLE PERSON (ID BIGINT IDENTITY NOT NULL, FIRSTNAME VARCHAR, LASTNAME VARCHAR, DEPARTMENT_ID BIGINT, PRIMARY KEY (ID))
CREATE TABLE DEPARTMENT (ID BIGINT IDENTITY NOT NULL, NAME VARCHAR, PRIMARY KEY (ID))
ALTER TABLE PERSON ADD CONSTRAINT FK_PERSON_DEPARTMENT_ID FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENT (ID)

环境是: - eclipselink 2.5.2 - mysql-connector-java 5.1.6

我希望在外键定义上至少有一个 ON DELETE CASCADE 子句。 在@ManyToOne 关系中,级联选项的用途是什么? 我真的必须在删除父记录之前手动删除子记录吗?

【问题讨论】:

标签: jpa eclipselink


【解决方案1】:

您在示例中提到的CascadeType 是其中一个值:ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH。这是ORM,但 SQL DDL 无关。

我猜您正在搜索 SQL DDL 外键约束定义...on delete cascade。要生成此 SQL DDL,您需要一个 @CascadeOnDelete 注释,如下例所示:

...
@OneToMany(mappedBy="abc", orphanRemoval=true, cascade={CascadeType.ALL})
@CascadeOnDelete
private List<MobilPhoneNumer> mobilePhonesNumbers;
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2018-12-02
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2011-11-09
    相关资源
    最近更新 更多