Ассоциация @ManyToMany не вставлена ​​во вторую таблицу - PullRequest
0 голосов
/ 15 августа 2011

Я хочу вставить данные в таблицу, которая связана с другой таблицей в связи ManyToMany. Когда я вставляю данные, они вставляются в таблицу, но связь с другими данными во второй таблице отсутствует. Это приложение Java EE, использующее JSF2 + Spring + Hibernate.

Вот сущность:

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

private int id;
private String nom;
private Set<Formation> mesformations;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "USER_ID")
public int getId() {
    return id;
}

/**
 * @param id the id to set
 */
public void setId(int id) {
    this.id = id;
}

/**
 * @return the nom
 */
@Column(name="NOM",length=50)
public String getNOM() {
    return nom;
}
/**
 * @param nom the nom to set
 */
public void setNom(String nom) {
    this.nom = nom;
}
/**
 * @return the mesFormations
 */
@ManyToMany
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})
     @JoinTable(name = "USER_FORM",
                       joinColumns = @JoinColumn(name = "user_id",
                               referencedColumnName = "USER_ID"),  
        inverseJoinColumns = @JoinColumn(name = "form_id", referencedColumnName = "ID"))

    public Set<Formation> getMesFormations() {
    return mesFormations;
}
/**
 * @param mesFormations the mesFormations to set
 */
public void setMesFormations(Set<Formation> mesFormations) {
    this.mesFormations = mesFormations;
}

public void addToFormation(Formation formation) {

    if(mesFormation==null)
    {
        mesFormations=new HashSet<Formation>();
    }

    mesFormations.add(formation);

}

.....

   }

Formation.java

 @Entity
 @Table(name="Foramtion")
 public class Formation {

private int id;
private String nomFormation;
private int nombreMatiere;

private Set<User> mesUsers;


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
public int getId() {
    return id;
}

/**
 * @param id the id to set
 */
public void setId(int id) {
    this.id = id;
}


/**
 * @return the mesUsers
 */
@ManyToMany(mappedBy = "mesFormations",fetch=FetchType.LAZY)
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})
public Set<User> getMesUsers() {
    return mesUsers;
}

/**
 * @param mesUsers the mesUsers to set
 */
public void setMesUsers(Set<User> mesUsers) {
    this. mesUsers =  mesUsers;
}


/**
 * @return the nomFormation
 */
@Column(name="NOM_FORMATION",length=50,unique=true)
public String getNomFormation() {
    return nomForamtion;
}
/**
 * @param nomFormation the nomForamtion to set
 */
public void setNomForamtion(String nomForamtion) {
    this.nomForamtion = nomForamtion;
}

/**
 * @return the nombreMatiere
 */

public int getNombreMatiere() {
    return nombreMatiere;
}
/**
 * @param nombreMatiere the nombreMatiere to set
 */
public void setNombreMatiere(int nombreMatiere) {
    this.nombreMatiere = nombreMatiere;
}

public void addToUser(User user) {

   if(mesUser==null)
    {
      mesUsers=new HashSet<User>();

    }
       mesUsers.add(user);
       user.addToFormation(this); 


}

public void removeFromUser(User user) {
    this.getMesUsers().remove(user);
    user.getMesUsers().remove(this);
}


 }

метод уровня DAO, который обеспечивает постоянство пользователя

    public User enregistrer(User user) {
    // TODO Auto-generated method stub
      this.getSession().beginTransaction();
     this.getSession().persist(user);
     this.getSession().beginTransaction().commit();
     return Entity ;
  }

метод сервисного уровня, позволяющий вызвать метод сохранения даослоя

  public User persistUser(User user, List<Integer> idList){

    for(Integer id : idList){

        Formation form = iformationDao.findById(id);
                     form.addToUser(user);

    }
    return iuserDao.enregistrer(user);

благодарю за ответ

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

изменение от

public User enregistrer(User user) {
// TODO Auto-generated method stub
  this.getSession().beginTransaction();
 this.getSession().persist(user);
 this.getSession().beginTransaction().commit();
 return Entity ;

}

до

   public User enregistrer(User user) {
    // TODO Auto-generated method stub
     Transaction tx =  this.getSession().beginTransaction();//change
     this.getSession().persist(user);
     tx.commit();//change 
     return Entity ;
  }
0 голосов
/ 15 августа 2011

Мне кажется, у вас установлены значения CascadeTypes:

@Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})

пока вы звоните:

this.getSession().persist(user);

Я думаю, вам нужно добавить CascadeType.PERSIST к аннотации @Cascade, чтобы получить желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...