Deleting JPA entity containing @CollectionOfElements throws ConstraintViolationException

Posted by Lyle on Stack Overflow See other posts from Stack Overflow or by Lyle
Published on 2010-06-15T22:14:06Z Indexed on 2010/06/16 21:22 UTC
Read the original article Hit count: 593

Filed under:
|

I'm trying to delete entities which contain lists of Integer, and I'm getting ConstraintViolationExceptions because of the foreign key on the table generated to hold the integers. It appears that the delete isn't cascading to the mapped collection.

I've done quite a bit of searching, but all of the examples I've seen on how to accomplish this are in reference to a mapped collection of other entities which can be annotated; here I'm just storing a list of Integer. Here is the relevant excerpt from the class I'm storing:

@Entity
@Table(name="CHANGE_IDS")
@GenericGenerator(
        name = "CHANGE_ID_GEN",
        strategy =  "org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters = {
                @Parameter(name="sequence_name", value="course_changes_seq"),
                @Parameter(name="increment_size", value="5000"),
                @Parameter(name=" optimizer", value="pooled")
                     }
    )
@NamedQueries ({
    @NamedQuery(
        name="Changes.getByStatus",
        query=  "SELECT c " +
                "FROM DChanges c " +
                "WHERE c.status = :status "),
    @NamedQuery(
            name="Changes.deleteByStatus",
            query=  "DELETE " +
                    "FROM Changes c " +
                    "WHERE c.status = :status ")
})
public class Changes {
    @Id
    @GeneratedValue(generator="CHANGE_ID_GEN")
    @Column(name = "ID")
    private final long id;

    @Enumerated(EnumType.STRING)
    @Column(name = "STATUS", length = 20, nullable = false)
    private final Status status;

    @Column(name="DOC_ID")
    @org.hibernate.annotations.CollectionOfElements
    @org.hibernate.annotations.IndexColumn(name="DOC_ID_ORDER")
    private List<Integer> docIds;
}

I'm deleting the Changes objects using a @NamedQuery:

final Query deleteQuery = this.entityManager.createNamedQuery("Changes.deleteByStatus");
deleteQuery.setParameter("status", Status.POST_FLIP);
final int deleted = deleteQuery.executeUpdate();
this.logger.info("Deleted " + deleted + " POST_FLIP Changes");

© Stack Overflow or respective owner

Related posts about hibernate

Related posts about jpa