2016-10-06 9 views
0

休止状態でIm strugglin。オブジェクトを削除しようとしていますが、SQL例外が発生しています。エンティティを削除するときに制約違反が発生する

だから、最初に私のマッピング:

@Entity 
public class Meetup { 

    @Id 
    @GeneratedValue 
    @Column 
    private long id; 

    @Column(nullable = false) 
    private ZonedDateTime dateAndTime; 

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.PERSIST) 
    private Location location; 

////////////////////////

@Entity 
public class Location { 

    @Id 
    @GeneratedValue 
    @Column 
    private long id; 

    @Column(nullable = false) 
    private String name; 

    @Column(nullable = false) 
    private double longitude; 

    @Column(nullable = false) 
    private double latitude; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "location") 
    private List<Meetup> meetups; 

/// ///////////////////////

@Entity 
public class Match { 
    @Id 
    @GeneratedValue 
    @Column 
    private long id; 

    @ManyToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL) 
    private List<User> users = new ArrayList<>(); 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name = "meetup_id") 
    private Meetup meetup; 

だから私は、ミートアップエンティティを削除しようとしていますが、それを行うことで、対応するLocationエンティティを削除したくありません。今、私は問題はミートアップクラスでマッピングの「ALL」にカスケードタイプを変更することで解決したが、その後、明らかに私の場所することができ

constraint ["FKJRLUYUGNHRKYWSVSRE8VE9I9D: PUBLIC.MATCH FOREIGN KEY(MEETUP_ID) REFERENCES PUBLIC.MEETUP(ID) (1)"; SQL statement: delete from meetup where id=? [23503-192]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 

を取得しています(entityManager.remove)ミートアップのエンティティを削除しようとしているときエンティティも削除されます。そして、これは私が起こりたくないことです。だから、どのように私は場所エンティティを削除せずにミートアップエンティティを削除することができますか?

+0

他の人があなたを助けることができるように、あなたの完全な例外テキストをダンプします.1 –

+0

「Meetup」を削除するには、最初にそれを参照するすべての「Match」エンティティを削除する必要があります。これは、 'Meetup'にバックリファレンスを追加し、それに対応するカスケードを追加することで行うことができます。 - 'Location'はあなたの問題の一部ではないことに注意してください:" _PUBLIC.MATCH_ FOREIGN KEY(MEETUP_ID)REFERENCES PUBLIC.MEETUP(ID) "。 – Thomas

+0

うん、私はそれを気づいたが、その後、私はマッチを削除しなければならないし、私はそれがManyToMany関係のために発生したので、私はマッチを削除する必要があります、そして最後に私は別のテーブル(制約ManyToMany関係)ミートアップを削除できます。私はちょうどミートアップを削除するためにデータベース全体を一掃したので、ちょっと怖いです。それのために私のデザインが吸うのですか? 2人のユーザーが一致した場合、場所Xでミートアップを行うことにしましたが、その後は場所Yに行きたいと思っていましたが、まだお互いが好きです(一致する必要があります):D – filemonczyk

答えて

1

あなたは、単にする必要があるすべては、トランザクションの境界内に次のようにあなたがMeetUpの除去を扱うことを確認している:あなたのモデルを考える

// Get your meetup by identifier 
final Meetup meetup = entityManager.find(Meetup.class, meetupId); 

// cleanup the match associations with meetup 
entityManager.createQuery("FROM Match WHERE meetup = :meetup") 
     .setParameter("meetup", meetup) 
     .getResultList() 
     .forEach(match -> { match.setMeetup(null); }); 

// remove meetup 
entityManager.remove(meetup); 

、用カスケード操作でごまかすする必要はありませんこのユースケース。

+0

カスケード操作を使用する必要がありますか?私はそれが毎回推奨されるので、私は、より少ない労力で最新のデータベースを持つことができました – filemonczyk

関連する問題