我有三個類:PeelTestFile,DiscreteJob和PeelTestFileJob。這與User,Group和UserGroup的典型問題類似。我試圖刪除一個PeelTestFileJob。當我這樣做時,它將外鍵設置爲空。這是一個問題,因爲我將外鍵設置爲NOT NULL,這是正確的。我希望它只刪除數據庫中的一條記錄,然後在Java中,我希望它從它所屬的兩個集合中刪除實例(這是它似乎設置爲空的地方)。如何正確地從休眠中的多對多中刪除聯接實例
以下是我的代碼。什麼是正確的方法來做到這一點?
public class DiscreteJob
{
private Set<PeelTestFileJob> peelTestJobs;
/**
* @hibernate.set
* inverse="true"
* lazy="true"
* cascade="all-delete-orphan"
* @hibernate.collection-key
* column="WIP_ENTITY_ID"
* @hibernate.collection-one-to-many
* class="com.icumed.ifactory3.dto.PeelTestFileJob"
*/
public Set<PeelTestFileJob> getPeelTestJobs()
{
return this.peelTestJobs;
}
public boolean remove(
PeelTestFileJob peelTestFileJob)
{
return this.peelTestJobs.remove(peelTestFileJob);
}
public void setPeelTestJobs(
Set<PeelTestFileJob> peelTestJobs)
{
this.peelTestJobs = peelTestJobs;
}
}
public class PeelTestFile
{
private Set<PeelTestFileJob> peelTestFileJobs;
/**
* @hibernate.set
* inverse="true"
* lazy="true"
* cascade="all-delete-orphan"
* @hibernate.collection-key
* column="PEEL_TEST_FILE_ID"
* @hibernate.collection-one-to-many
* class="com.icumed.ifactory3.dto.PeelTestFileJob"
*/
public Set<PeelTestFileJob> getPeelTestFileJobs()
{
return this.peelTestFileJobs;
}
public boolean remove(
PeelTestFileJob peelTestFileJob)
{
return this.peelTestFileJobs.remove(peelTestFileJob);
}
public void setPeelTestFileJobs(
Set<PeelTestFileJob> jobs)
{
this.peelTestFileJobs = jobs;
}
}
public class PeelTestFileJob
{
private PeelTestFile peelTestFile;
private DiscreteJob job;
private User createdBy;
private Date creationDate;
/**
* @hibernate.many-to-one
* column="PEEL_TEST_FILE_ID"
* not-null="true"
* outer-join="false"
*/
public PeelTestFile getPeelTestFile()
{
return this.peelTestFile;
}
public void setPeelTestFile(
PeelTestFile file)
{
this.peelTestFile = file;
}
/**
* @hibernate.many-to-one
* column="WIP_ENTITY_ID"
* not-null="true"
* outer-join="false"
*/
public DiscreteJob getJob()
{
return this.job;
}
public void setJob(
DiscreteJob job)
{
this.job = job;
}
}
下面是我的代碼,這是造成問題:
super.getHibernateTemplate().delete(peelTestFileJob);
if (job.remove(peelTestFileJob)) // setting foreign key to null?
{
if (peelTestFile.remove(peelTestFileJob)) // setting foreign key to null?
{
if (peelTestFile.getPeelTestFileJobs().isEmpty())
{
// modify the peel test file here
getPeelTestFileDAO().update(peelTestFile, bioIdentification);
}
}
}
我需要該表和該類,因爲除了連接數據之外還有其他信息。還有這些列:created_by,creation_date,last_updated_by,last_update_date。 –
編輯所以你可以保留連接表內的其他列,我的主要區別是** ** **和** cascade **屬性 – Angga
我終於有時間回來了。我現在遇到的問題是,在調用「this.genericDao.remove(ab)」後,我需要調用「b.getTestJoins()。remove(ab)」,因爲我要回到一個Web頁面這將顯示b和設置。那時,當我在同一個會話中,並且現在提交事務時,Hibernate嘗試設置A_JOIN_B.B_ID = null,由於B_ID不可爲空,這會導致問題。 –