ヘルパーテーブルのカスケード削除

I would like to delete all rows in tbl_license_user_alert when deleting either a license or an user: http://www.img-teufel.de/uploads/Unbenannt1d4f8a349jpg.jpg

カスケードの設定はどこで行う必要がありますか?

カスケード属性または@カスケード注釈?

この目的のためにどのカスケードスタイルが必要ですか?

@Entity
@Table( name = "tbl_license" )
public class License implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue
  @Column( name = "id", nullable = false, columnDefinition = "serial" )
  private int id;

  @OneToMany( fetch = FetchType.LAZY, mappedBy = "id.license" )
  private List alerts;

 //getter + setter
}

@Entity
@Table( name = "tbl_license_user_alert" )
@AssociationOverrides({
  @AssociationOverride( name = "id.user", joinColumns = @JoinColumn( name = "user_id", columnDefinition = "int" ) ),
  @AssociationOverride( name = "id.license", joinColumns = @JoinColumn( name = "license_id", columnDefinition = "int" ) )
})
public class LicenseUserAlert implements Serializable
{
  private static final long serialVersionUID = 1L;

  @EmbeddedId
  private LicenseUserAlertId id;

  @Column( name = "timer", columnDefinition = "int default 86400" )
  private int timer = 86400;

  public LicenseUserAlertId getId()
  {
    return id;
  }

  public void setId( LicenseUserAlertId id )
  {
    this.id = id;
  }

  @Transient
  public License getLicense()
  {
    return id.getLicense();
  }

  public void setLicense( License license )
  {
    id.setLicense( license );
  }

  @Transient
  public User getUser()
  {
    return id.getUser();
  }

  public void setUser( User user )
  {
    id.setUser( user );
  }

  public int getTimer()
  {
    return timer;
  }

  public void setTimer( int timer )
  {
    this.timer = timer;
  }
}

@Embeddable
public class LicenseUserAlertId implements Serializable
{
  private static final long serialVersionUID = 1L;

  @ManyToOne
  @ForeignKey( name = "tbl_license_fkey" )
  private License license;

  @ManyToOne
  @ForeignKey( name = "tbl_user_fkey" )
  private User user;

  public LicenseUserAlertId( License license, User user )
  {
    this.license = license;
    this.user = user;
  }

  public LicenseUserAlertId()
  {
  }

  public License getLicense()
  {
    return license;
  }

  public void setLicense( License license )
  {
    this.license = license;
  }

  public User getUser()
  {
    return user;
  }

  public void setUser( User user )
  {
    this.user = user;
  }
}
1

1 答え

JPAを使用している場合は、License.alertsに次の注釈を追加してください。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "id.license", cascade = { CascadeType.REMOVE }, orphanRemoval = true)
private List alerts;

編集

orphanRemovalはjpa2.0からのものです。 OneToMany注釈。 (javax.persistence.OneToMany)

あなたがjpa2.0を持っていないなら、あなたはhibernateカスケードアノテーションによってjpaカスケードを補完することができます:

@OneToMany( .... cascade = {CascadeType.REMOVE} )
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List alerts;

このcascadeTypeは、後のhibernateバージョンでは非推奨です。 Hibernate 3.6.8のソースコードを参照してください:

/** @deprecated use @OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true) */
    @Deprecated DELETE_ORPHAN,
2
追加された
「孤児の救出」とは何ですか? "シンボルを見つけることができません"のためにビルドに失敗したためです。 Hibernate 3.5.6の使用。
追加された 著者 dtrunk,
テーブル「tbl_license_user_alert」の外部キー制約「tbl_license_fkey」に違反しています。詳細:キー(id)=(3)は、テーブル「tbl_license_user_alert」から依然として参照されています。cascade = {CascadeType.REMOVE} tbl_license_user_alert "となります。 (id = 3のtbl_licenseからの削除)
追加された 著者 dtrunk,
@dtrunk回答の編集を参照してください。
追加された 著者 Kent,