首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地删除hibernate中的多个连接实例?

如何正确地删除hibernate中的多个连接实例?
EN

Stack Overflow用户
提问于 2013-07-19 23:07:47
回答 1查看 691关注 0票数 0

我有三门课: PeelTestFile,DiscreteJob和PeelTestFileJob。这是一个类似的设置,用户,组和UserGroup经典问题。我正在尝试删除一个PeelTestFileJob。当我这样做时,它将外键设置为null。这是一个问题,因为我将外键设置为NULL,这是正确的。我希望它只删除数据库中的一个记录,然后在Java中,我希望它从它所属的两个集合中删除实例(这似乎是它设置null的地方)。

下面是我的密码。做这件事的正确方法是什么?

代码语言:javascript
复制
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;
  }
}

下面是导致问题的代码:

代码语言:javascript
复制
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);
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2013-07-20 08:06:50

您应该有2个实体类+1自动为多到多的关系创建表。由于使用关系表集(Set<PeelTestFileJob>)而不是DiscreteJob或PeelTestFile集,FK数据变为空的原因。

实体类示例将表A-很多连接到许多表B(在您的例子中,DiscreteJob与PeelTestFile):

表A:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
@ManyToMany(mappedBy="testJoins")
private Set<TestTableA> testJoins = new HashSet<TestTableA>();

________________________EDIT_________________ I对此进行测试,这是一项工作:

关键是在联接表实体中使用@OneToMany(mappedBy="bId", cascade = CascadeType.DETACH) bId is FK。如果你不需要,试着删除你的逆=真。反向:如果为真,Hibernate将不会尝试插入或更新此联接定义的属性。默认为假。

这是父表示例(如您的例子中的PeelTestFile或DiscreteJob ):

代码语言:javascript
复制
@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):

代码语言:javascript
复制
@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行:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17756832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档