【问题标题】:EclipseLink deleting referenced entityEclipseLink 删除引用的实体
【发布时间】:2011-05-27 12:56:36
【问题描述】:

我使用 EclipseLink 作为我的持久性单元。我在删除实体时遇到问题。以下示例:设备具有类型。有许多设备可以具有相同的类型。 我插入了一个视图类型和设备(指一个类型)。如果我现在要删除一个类型(设备引用),则该实体将从数据库中删除。这不应该发生,因为设备引用了该类型。 我做错了什么?

提前致谢!

我删除如下:

EntityManager em = factory.createEntityManager();
em.getTransaction().begin();

Query q = em.createQuery("SELECT d FROM DeviceType d WHERE d.name = :name");
q.setParameter("name", "Name");
Type type = (Type)q.getSingleResult();

em.remove(type);
em.getTransaction().commit();
em.close();

我的实体:

@Entity
public class Device {

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

    @OneToOne
    @JoinColumn(name="TYPE_ID", nullable = false)
    private Type type;
}
@Entity
public class Type {

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

    @Column(unique = true, nullable = false)
    private String name;    
}

【问题讨论】:

    标签: jpa eclipselink


    【解决方案1】:

    我不确定我是否清楚这个问题 - 当您调用 remove(type) 时,您是否期望出现异常?如果是这样,请检查您是否在 Device->Type 关系上设置了数据库约束,这将在删除时引发异常。表是如何创建的?

    如果问题是您遇到了异常 - 这是因为您不应该删除一个实体而不先清理对它的引用。应该在删除之前查询设备并修复对类型的任何引用,即:

    Query q = em.createQuery("SELECT device FROM Type device WHERE device.type.name :name"); 
    q.setParameter("name", "Name"); 
    List devices = q.getResultList();  
    

    集合中每个返回的设备都应该引用相同的类型实例,因此您可以在之后将其删除。如果您希望能够从类型实例访问它们,您还可以将映射更改为 ManyToOne,然后将 Type 中的 OneToMany 设置回设备。

    【讨论】:

    • 是的,我期待一个例外。这些表是这样创建的:CREATE TABLE DEVICE (ID BIGINT AUTO_INCREMENT NOT NULL, YPE_ID BIGINT NOT NULL, PRIMARY KEY (ID)) ALTER TABLE DEVICE ADD CONSTRAINT FK_DEVICE_TYPE_ID FOREIGN KEY (TYPE_ID) REFERENCES TYPE (ID) CREATE TABLE TYPE (ID BIGINT AUTO_INCREMENT NOT NULL, NAME VARCHAR(255) NOT NULL UNIQUE, PRIMARY KEY (ID)) 也许我的注释有误?
    • 似乎 MySQL 没有在 MyISAM 中保存约束。所以,也许改用 InnoDB 可以解决我的问题。
    • 将引擎设置为 InnoDB 解决了这个问题。现在我得到了例外。唯一的问题是通过属性eclipselink.ddl.default-table-suffixeclipselink.ddl-generation.table-creation-suffix 配置引擎对我不起作用。需要在my.cnf中设置默认引擎。
    猜你喜欢
    • 2011-01-29
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2018-08-08
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多