1

2 つのクラス間の双方向の関係をマッピングしました。これが状況です。トリップとユーザーがいます。ユーザーは、旅行を購読したり、購読を解除したりできる必要があります。したがって、結合テーブルの行のみを削除して、オブジェクトを削除したくありません。現在、購読部分は機能しますが、購読解除はできません。

テストすると、変更はメモリ内で行われますが、データベースでは行われません。何が間違っている可能性がありますか?私のコードを以下に示します。

旅行:

@ManyToMany(mappedBy = "enrolledExecutionMoments", cascade = {
        CascadeType.ALL, CascadeType.ALL }, fetch = FetchType.EAGER)
private List<User> tripExecutionMomentParticipators = new ArrayList<User>();

public TripExecutionMoment() {

}

public int getId() {
    return id;
}

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

@JsonIgnore
public List<User> getTripExecutionMomentParticipators() {
    return tripExecutionMomentParticipators;
}

public void setTripExecutionMomentParticipators(
        List<User> tripExecutionMomentParticipators) {
    this.tripExecutionMomentParticipators = tripExecutionMomentParticipators;
}

public void addEnrollement(User user) {
    tripExecutionMomentParticipators.add(user);
}

public void removeEnrollement(User user) {
    tripExecutionMomentParticipators.remove(user);
}

ユーザー:

@Entity
@Table(name = "t_user")
public class User {

    @Id
    @GeneratedValue
    private int id;

    @NotBlank(message = "err_invalid_mail")
    @Email(message = "err_invalid_mail")
    private String email;

    @ManyToMany(cascade = { CascadeType.ALL, CascadeType.ALL }, fetch = FetchType.EAGER)
    @JoinTable(joinColumns = { @JoinColumn(name = "userId") }, inverseJoinColumns = { @JoinColumn(name = "tripExecutionMomentId") })
    private List<TripExecutionMoment> enrolledExecutionMoments = new ArrayList<TripExecutionMoment>();

    public User() {
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getId() {
        return id;
    }

    @JsonIgnore
    public TripExecutionMoment getCheckedInTripExecutionMoment() {
        return checkedInTripExecutionMoment;
    }

    public void setCheckedInTripExecutionMoment(
            TripExecutionMoment checkedInTripExecutionMoment) {
        this.checkedInTripExecutionMoment = checkedInTripExecutionMoment;
    }

    public void addEnrollement(TripExecutionMoment tripExecutionMoment) {
        enrolledExecutionMoments.add(tripExecutionMoment);
    }

    public void removeEnrollement(TripExecutionMoment tripExecutionMoment) {
        enrolledExecutionMoments.remove(tripExecutionMoment);
    }
}

これは、登録(購読)および登録解除(購読解除)するコードです

@Transactional
public void enrollParticipator(User user,
        TripExecutionMoment tripExecutionMoment)
        throws AlreadyBoundException {
    if (tripExecutionMoment.getTripExecutionMomentParticipators().contains(
            user)) {
        throw new AlreadyBoundException(
                "This user is already enrolled for this trip");
    }
    tripExecutionMoment.addEnrollement(user);
    user.addEnrollement(tripExecutionMoment);

    getEntityManager().merge(tripExecutionMoment);
}

@Transactional
public void disenrollParticipator(User user,
        TripExecutionMoment tripExecutionMoment) {
    tripExecutionMoment.removeEnrollement(user);
    user.removeEnrollement(tripExecutionMoment);
    getEntityManager().merge(user);
}
4

0 に答える 0