2011-05-27 90 views
0

我使用EclipseLink作爲我的持久單元。我在刪除實體時遇到問題。下面的例子:一個設備有一個類型。有很多設備可能具有相同的類型。 我插入了一個視圖類型和設備(這是指一個類型)。如果我現在刪除一個類型(一個設備引用的),那麼該實體將從數據庫中刪除。這不應該發生,因爲設備引用了該類型。 我做錯了什麼?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;  
} 

回答

0

我不知道,我清楚的問題儘管 - 當你調用remove(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設置回設備,以便能夠從類型實例訪問它們。

+0

是的,我期待着一個例外。創建表如下所示: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)引用類型(ID) CREATE TABLE TYPE(ID BIGINT AUTO_INCREMENT NOT NULL,NAME VARCHAR(255)NOT NULL UNIQUE,PRIMARY KEY(ID))'也許我的註釋是錯誤的? – Stefan 2011-05-27 20:16:26

+0

看來,MySQL不保存MyISAM中的約束。所以,也許換成InnoDB可以解決我的問題。 – Stefan 2011-05-27 20:47:30

+0

將引擎設置爲InnoDB解決了這個問題。現在我得到了例外。通過屬性「eclipselink.ddl.default-table-suffix」或「eclipselink.ddl-generation.table-creation-suffix」配置引擎的唯一問題不適用於我。需要在'my.cnf'中設置默認引擎。 – Stefan 2011-05-28 08:00:48