-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: MySQL InnoDB avec Hibernate
PostPosted: Mon Mar 01, 2010 2:10 pm 
Newbie

Joined: Mon Mar 01, 2010 1:55 pm
Posts: 3
Bonsoir,

J'utilise Hibernate sur un MySQl, j'ai un soucis de contrainte
intégrité sur la suppression en cascade, lié InnoDB.

Par exemple :

Code:
@Entity
class User {
    @OneToMany(cascade=CascadeType.ALL)
    Collection<Notification> notifications;
}

@Entity
class Notification {
}


Quand je supprime un user, il commence par supprimer le user et pas le
lien entre le user et les notifications, d'où une erreur d'intégrité
sur la clé étrangère dans la table de jointure. Par contre si j'utilise
MyISAM en moteur sur MySQL je n'ai plus de soucis car plus de clé
étrangère. Mais je souhaite utiliser le moteur InnoDB pour la gestion des
transactions.

Est-ce normal ? Est-ce que j'ai oublié quelque chose ?

Merci
jru


Top
 Profile  
 
 Post subject: Re: MySQL InnoDB avec Hibernate
PostPosted: Tue Mar 02, 2010 4:48 am 
Regular
Regular

Joined: Thu May 07, 2009 5:56 am
Posts: 94
Location: Toulouse, France
salut,

je sais pas si cela peut jouer mais utilises-tu le bon Dialect ?
org.hibernate.dialect.MySQLInnoDBDialect
//An SQL dialect for MySQL 5.x specific features.
org.hibernate.dialect.MySQL5InnoDBDialect

j'utilise MySQL 5.1 avec InnoDb dans mes applications (avec cascade delete) et je ne rencontre pas ce pb.

_________________
everything should be made as simple as possible, but not simpler (AE)


Top
 Profile  
 
 Post subject: Re: MySQL InnoDB avec Hibernate
PostPosted: Tue Mar 02, 2010 6:12 am 
Newbie

Joined: Mon Mar 01, 2010 1:55 pm
Posts: 3
Hello,

J'ai essayé l'ensemble des dialects, j'ai toujours le soucis.
Est-ce que tu peux vérifier si tu as des contraintes de type clé étrangère dans les tables de jointure ? stp

jru


Top
 Profile  
 
 Post subject: Re: MySQL InnoDB avec Hibernate
PostPosted: Tue Mar 02, 2010 7:50 am 
Regular
Regular

Joined: Thu May 07, 2009 5:56 am
Posts: 94
Location: Toulouse, France
re,

tiens, j'ai fait un petit test de mon côté et oui, tout marche bien:

Code:
@Entity
public class Bar
{
   @ManyToMany(cascade =
      { CascadeType.ALL })
   private List<Foo> foos = new ArrayList<Foo>();
}


La création du schéma:
Code:
create table Bar (id integer not null auto_increment, primary key (id)) ENGINE=InnoDB
create table Bar_Foo (Bar_id integer not null, foos_id integer not null) ENGINE=InnoDB
create table Foo (id integer not null auto_increment, primary key (id)) ENGINE=InnoDB

alter table Bar_Foo add index FK4F54165AE13B685A (Bar_id), add constraint FK4F54165AE13B685A foreign key (Bar_id) references Bar (id)
alter table Bar_Foo add index FK4F54165ABEBD273 (foos_id), add constraint FK4F54165ABEBD273 foreign key (foos_id) references Foo (id)


le code de test:
Code:
tx.begin();

      Foo f1 = new Foo();
      Foo f2 = new Foo();

      Bar bar = new Bar();

      bar.getFoos().add(f1);
      bar.getFoos().add(f2);

      em.persist(bar);
tx.commit();

//partie remove
tx.begin();
    em.remove(bar);
tx.commit();


les traces SQL du delete:
Code:
Hibernate: delete from Bar_Foo where Bar_id=?
Hibernate: delete from Foo where id=?
Hibernate: delete from Foo where id=?
Hibernate: delete from Bar where id=?



J'utilse:
MySQL 5.1 (avec driver JDBC mysql-connector-java-5.1.10-bin.jar)
Hibernate Core 3.2.2.GA
Dialect: org.hibernate.dialect.MySQL5InnoDBDialect

Bon, si tu te retrouves toujours bloqué tu peux désactiver la création de contraintes dans ton cas (ce n'est pas la solution mais ça te permettra d'avancer en attendant de trouver l'origine de tob pb). Voir viewtopic.php?f=6&t=978321

_________________
everything should be made as simple as possible, but not simpler (AE)


Top
 Profile  
 
 Post subject: Re: MySQL InnoDB avec Hibernate
PostPosted: Tue Mar 02, 2010 11:12 am 
Newbie

Joined: Mon Mar 01, 2010 1:55 pm
Posts: 3
Excuse moi, j'ai refais un essai en dehors du projet, je me suis rendu compte que je n'avais pas le cascade sur la liste et je ne supprime pas Bar mais un Foo, et là je retrouve mon erreur.

Code:
@Entity
public class Bar
{
   @ManyToMany
   private List<Foo> foos = new ArrayList<Foo>();
}


Code:
tx.begin();

      Foo f1 = new Foo();
      em.persist(f1);
      Foo f2 = new Foo();
      em.persist(f2);

      Bar bar = new Bar();

      bar.getFoos().add(f1);
      bar.getFoos().add(f2);

      em.persist(bar);
tx.commit();

//partie remove
tx.begin();
    em.remove(f1);
tx.commit();


jru


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.