我有三门课: PeelTestFile,DiscreteJob和PeelTestFileJob。这是一个类似的设置,用户,组和UserGroup经典问题。我正在尝试删除一个PeelTestFileJob。当我这样做时,它将外键设置为null。这是一个问题,因为我将外键设置为NULL,这是正确的。我希望它只删除数据库中的一个记录,然后在Java中,我希望它从它所属的两个集合中删除实例(这似乎是它设置null的地方)。
下面是我的密码。做这件事的正确方法是什么?
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);
}
}
}发布于 2013-07-20 08:06:50
您应该有2个实体类+1自动为多到多的关系创建表。由于使用关系表集(Set<PeelTestFileJob>)而不是DiscreteJob或PeelTestFile集,FK数据变为空的原因。
实体类示例将表A-很多连接到许多表B(在您的例子中,DiscreteJob与PeelTestFile):
表A:
@ManyToMany(cascade = CascadeType.REFRESH)
@JoinTable(name="A_JOIN_B",
joinColumns={@JoinColumn(name="A_ID")},
inverseJoinColumns={@JoinColumn(name="B_ID")})
private Set<TestTableB> testJoins = new HashSet<TestTableB>();表B:
@ManyToMany(mappedBy="testJoins")
private Set<TestTableA> testJoins = new HashSet<TestTableA>();________________________EDIT_________________ I对此进行测试,这是一项工作:
关键是在联接表实体中使用@OneToMany(mappedBy="bId", cascade = CascadeType.DETACH) bId is FK。如果你不需要,试着删除你的逆=真。反向:如果为真,Hibernate将不会尝试插入或更新此联接定义的属性。默认为假。
这是父表示例(如您的例子中的PeelTestFile或DiscreteJob ):
@Entity
@Table(name = "TEST_TABLE_B")
public class TestTableB {
//constructors here
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "B_ID")
private Long id;
@Column(name = "B_NAME")
private String bName;
@OneToMany(mappedBy="bId", cascade = CascadeType.DETACH)
private Set<AJoinB> testJoins = new HashSet<AJoinB>();
//getters and setters here这个A连接B表示例(在您的例子中是PeelTestFileJob):
@Entity
@Table(name = "A_JOIN_B")
public class AJoinB {
//constructors here
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private Long id;
@Column(name = "C_NAME")
private String aName;
//you can add another column here
@Column(name = "A_ID", nullable = false)
private Long aId;
@Column(name = "B_ID", nullable = false)
private Long bId;
//getter setters here当我在java中执行这个命令时,我删除A连接B表中的1行:
TestTableB b = (TestTableB) this.genericDao.getList("from TestTableB b where b.id = 1",false,null).get(0);
Set<AJoinB> testJoins = b.getTestJoins();
AJoinB ab = (AJoinB) testJoins.toArray()[0];
this.genericDao.remove(ab);https://stackoverflow.com/questions/17756832
复制相似问题