2014-04-01 90 views
0

我有一個數據庫的Web應用程序,其中兩個實體具有多對多的關係,但我手動實現了連接表。當其中一個實體被刪除時,它會刪除連接表中的所有條目並更新另一個實體,因此所有實體都可以很好地工作,但現在我應該爲此功能編寫一個測試。爲了測試我使用的內存數據庫,這就是真正的,唯一的區別,具有相同的註解(和級聯型)相同的方法被調用,但我不斷收到:CascadeType不適用於內存數據庫

org.hibernate.exception.ConstraintViolationException: integrity constraint violation: foreign key no action; FKC17477FD8940DF2B table ENTITY1_ENTITY2 

我沒有粘貼任何代碼自從它工作以來,我不相信它有什麼問題。我不要求爲我解決這個問題,我只需要知道什麼可能會導致這種行爲,因爲我剛剛用完了想法,我不知道還有什麼要搜索的......謝謝

編輯:下面是一些代碼:

@Entity 
@Table(name = "interviewer") 
public class Interviewer implements Identifiable { 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "interviewer_id") 
    private Collection<InterviewerTechnology> technologies; 
} 


@Entity 
@Table(name = "technology") 
public class Technology implements Identifiable { 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name = "technology_id") 
    private Collection<InterviewerTechnology> technologies; 
} 

@Entity 
@Table(name = "interviewer_technology") 
public class InterviewerTechnology implements Identifiable { 

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

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY) 
    private Interviewer interviewer; 

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) 
    private Technology technology; 
} 

@Component 
public class TechnologyDao extends AbstractEntityDao<Technology> { 

    public void remove(Integer id) { 
     Technology technology = find(id); 
     em.remove(technology); 
    } 
} 

此代碼不正是我想要它做的,它似乎只是用於測試,並沒有看到CascadeType的參數在這裏做所有的工作

+0

如果您向我們展示代碼,對我們來說,這仍然會輕鬆許多。 – Schokea

+0

好的,會粘貼相關的部分 – Lucas

+0

嘗試CascadeType.PERSIST – Schokea

回答

0

數據庫我發現了這個問題,它是@Transactional註釋。我所有的測試DAOs都擴展了通用測試DAO,該測試用@Transactional加註,我再次用它盲注每一個DAO。這裏的問題是一些操作需要作爲單個事務執行(執行後可能需要flush()),以便數據可用於其他操作。考慮以下示例:

@Transactional 
public abstract class AbstractEntityDao<E> { 
    @PersistenceContext(unitName = "some-persistence") 
    protected EntityManager em; 

    public E create(E e) { 
     em.persist(e); 
     return e; 
    } 
    (...) 
} 

這意味着此類中的每個方法都是一個事務。現在,如果我們使用@Transactional註解擴展此類的另一個類,則每種方法都將是另一個事務,這意味着如果我們在一種方法中刪除多個事物,它應該執行多個事務(它們都需要調用flush()方法才能執行級聯),但相反,他們將作爲一個交易運行(除非我們指定Propagation)。讓大家(尤其是我)認真思考哪些操作需要單獨的事務,哪些操作可以作爲一個單獨執行。

相關問題