次のエンティティがあります。
@Entity
@Table(name = "parameter_choice")
@NamedQueries({
@NamedQuery(name = "listParameterChoicesByParameter",
query = "SELECT pc FROM ParameterChoice pc WHERE pc.ParameterId = :parameterId")
})
@XmlRootElement
@Cacheable(false)
public class ParameterChoice implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ParameterChoiceSequenceGenerator")
@SequenceGenerator(allocationSize = 1, name = "ParameterChoiceSequenceGenerator", sequenceName = "parameter_choice_id_seq")
@Column(nullable = false)
private Integer id;
@Column(name = "parameter_id", nullable = false)
private Integer ParameterId;
@Column(name = "parent_parameter_choice_id", nullable = true)
private Integer parentParameterChoiceId;
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.REMOVE)
@JoinColumn(name = "parent_parameter_choice_id", insertable = false, updatable = false)
private List<ParameterChoice> parameterChoices;
@Column(name = "canonical_name", nullable = false)
private String canonicalName;
@Column(name = "ui_only", nullable = false)
private Boolean uiOnly;
次に、エンティティを作成してから、最初のエンティティの ID を として 2 番目のエンティティを作成しますparentParameterChoiceId
。最初のエンティティを削除しようとすると、外部キー制約エラーが発生します。
org.postgresql.util.PSQLException: ERROR: update or delete on table "parameter_choice" violates foreign key constraint "fk_parameter_choice_parameter_choice" on table "parameter_choice" Detail: Key (id)=(15) is still referenced from table "parameter_choice"
ご覧のとおり、orphanRemoval = true, cascade = CascadeType.REMOVE
結果はありませんでした。最初のエンティティ インスタンスとそのすべてのサブエンティティをカスケード削除する方法はありますか?
EDIT エンティティを作成するコード:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/parameter-choice")
public String addParameterChoice(ParameterChoice parameterChoice) {
String bodyContent = "";
String errMessage = "Error in POST: /parameter-choice/.";
try {
em.persist(parameterChoice);
bodyContent = mapper.writeValueAsString(parameterChoice);
return responseBuilder.buildString(bodyContent, ResponseBuilder.OK);
} catch (IOException e) {
logger.log(Level.SEVERE, errMessage, e);
return responseBuilder.buildString("errMessage", ResponseBuilder.ERROR);
}
}
エンティティを削除するコード:
@DELETE
@Produces(MediaType.APPLICATION_JSON)
@Path("/parameter-choice/{parameterChoiceId}")
public String deleteParameterChoice(@PathParam("parameterChoiceId") String parameterChoiceId) {
String bodyContent = "OK";
ParameterChoice parameterChoice = em.find(ParameterChoice.class, Integer.parseInt(parameterChoiceId));
em.remove(parameterChoice);
return responseBuilder.buildString(bodyContent, ResponseBuilder.OK);
}