5

私のプロジェクトには、ユーザーと会社のエンティティがあります。

@Entity
@Table(name = "users")
public class UserDetails {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private int id;

    @Column(name = "first_name")
    @NotEmpty
    @Size(min = 2, max = 20)
    private String firstName;

    @ManyToMany(cascade = CascadeType.REFRESH)
    @JoinTable(name = "users_companies",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "company_id"))
    private Set<CompanyDetails> userCompanies = new HashSet();

    //getters and setters of course...
}

@Entity
@Table(name = "companies")
public class CompanyDetails {
    @Id
    @GeneratedValue
    @Column(name = "company_id")
    private int id;

    @Column(name = "name")
    @NotEmpty
    @Size(min = 1, max = 255)
    private String name;

    @ManyToMany(mappedBy = "userCompanies")
    private Set<UserDetails> companyUsers = new HashSet();

}

ビューで会社にユーザーを割り当ててから、削除しようとします。ユーザーを削除すると、すべて問題ありません-ユーザーが削除され、「users_companies」テーブルからのレコードも削除され、会社は残ります(必要に応じて)。しかし、会社を削除しようとすると、次の根本原因でスタック トレースが発生します。

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`d_torianik/users_companies`, CONSTRAINT `FK447D806437A764EB` FOREIGN KEY (`company_id`) REFERENCES `companies` (`company_id`))

この問題の解決を手伝っていただけますか? ありがとうございました。

4

2 に答える 2

6

これは古いことは知っていますが、誰かを助けるかもしれません...私はまったく同じことをしようとしていました-各メインテーブルから削除して、結合されたテーブルで最初に参照されたレコードを削除し、次にメインテーブルからレコードを削除します。Benzonico の投稿は有効ですが、これを行うためのより簡単な方法があります (結合されたテーブルから自分でレコードを削除する必要はありません)。会社テーブルのマッピングもメイン テーブルになるように変更する必要があります (mappedBy は使用しないでください)。

@Entity
@Table(name = "companies")
public class CompanyDetails {
    @Id
    @GeneratedValue
    @Column(name = "company_id")
    private int id;

    @Column(name = "name")
    @NotEmpty
    @Size(min = 1, max = 255)
    private String name;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "users_companies",
    joinColumns = {@JoinColumn(name = "company_id")},
    inverseJoinColumns = @JoinColumn(name = "user_id"))
    private Set<UserDetails> companyUsers = new HashSet();

}

これでうまくいくはずです。会社を削除すると、Hibernate は最初に users_companies のレコードを削除し、次に会社自体を削除します。詳細はこちら: http://www.codereye.com/2009/06/hibernate-bi-directional-many-to-many.html

于 2014-03-25T20:47:29.967 に答える
1

エンティティのプロパティの注釈にCascadeType.REMOVEが必要です。CascadecompanyUsersCompanyDetails

[コメント後に編集]

申し訳ありませんが、私の答えで1つ見逃したのは、それが多対多であるということです。したがって、カスケード削除は機能しません。次に問題は、関係の責任者が UserDetails クラスであることです。そのため、一方の方法では機能し、もう一方の方法では機能しません。会社を削除する前に、companyUsers セットの各 UserDetails にある userCompanies セットからこの会社を削除する必要がある場合があります。

于 2013-03-01T12:50:12.527 に答える