0

I have a many-to-many association between Photo and Auteur entities, and 3 tables - AUTEUR, PHOTO_AUTEUR and PHOTO.

My Auteur mapping class:

@Entity
@Table(name = "AUTEUR")
public class Auteur implements Serializable {
@Id
@GeneratedValue
@Column(name = "auteur_id")
private int auteur_id;
@Column(name = "nom")
private String nom;
@Column(name = "prenom")
private String prenom;    
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, 
targetEntity = Photo.class)
@JoinTable(name = "PHOTO_AUTEUR",
        joinColumns = {
            @JoinColumn(name = "AUTEUR_ID")},
        inverseJoinColumns = {
            @JoinColumn(name = "PHOTO_ID")})
private Set<Photo> photos = new HashSet<Photo>();
...
}

and a Photo class:

@Entity
@Table(name = "PHOTO")
public class Photo extends News {
@Id
@GeneratedValue
@Column(name = "photo_id")
private int id;
@Column(name = "format")
private String format;
@Column(name = "largeur")
private int largeur;
@Column(name = "hauteur")
private int hauteur;
@Column(name = "siColoree")
private boolean siColoree;
@ManyToMany(mappedBy = "photos", fetch = FetchType.EAGER, cascade = CascadeType.ALL, targetEntity = Auteur.class)
private Set<Auteur> photo_auteurs = new HashSet<>();
@Lob
@Column(name = "image", length = 1000000)
private byte[] image;

...}

and when I try to update or delete Photo entry i get ConstraintViolationException, even if I manually have set cascade deleting and updating in mySql.

Margarita Spasskaya
  • 643
  • 2
  • 10
  • 24
  • I think you're missing onDelete="CASCADE".. may be this helps? http://stackoverflow.com/questions/14257004/doctrine2-symfony2-cascading-remove-integrity-constraint-violation-1451 – spiderman May 29 '15 at 23:42

1 Answers1

0

It works right without cascade restrictions

SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
session.delete(photo);
session.getTransaction().commit();
session.close();

with such mapping in Photo:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "PHOTO_AUTEUR",
        joinColumns = @JoinColumn(name = "PHOTO_ID"),
        inverseJoinColumns = @JoinColumn(name = "AUTEUR_ID"))
private Set<Auteur> photo_auteurs = new HashSet<>();

and in Auteur:

@ManyToMany(fetch = FetchType.EAGER, targetEntity = Photo.class)
@JoinTable(name = "PHOTO_AUTEUR",
        joinColumns = {
            @JoinColumn(name = "AUTEUR_ID")},
        inverseJoinColumns = {
            @JoinColumn(name = "PHOTO_ID")})
private Set<Photo> photos = new HashSet<>();
Margarita Spasskaya
  • 643
  • 2
  • 10
  • 24