Проблема с добавлением значений в мою базу данных с использованием JPA - PullRequest
0 голосов
/ 20 августа 2011

У меня есть функция, которая добавляет в мою базу данных (используя JPA) пользователя и его элементы, отношения многие ко многим.У меня есть следующие таблицы:

profilUser

item

associationProfileUserItem

в GUI Я ввожу логин и пароль пользователя и выбираю списокИз имен элементов я получил функцию восстановления идентификатора Item BY по их имени (чтобы добавить их в ассоциацию).проблема в том, что функция вставляет только последний выбранный пользователем элемент и игнорирует остальные!

мой код:

public void addProfilUser()
{    
  try{

        EntityTransaction entr=em.getTransaction();
        entr.begin();
        AssociationItemProfilPK ItemprofilPk=new AssociationItemProfilPK();
        AssociationItemProfil Itemprofil=new AssociationItemProfil();
        ProfilUser user=new ProfilUser();

        user.setLogin(login);
        user.setPassword(password);
        em.persist(user);

        for (Integer val : getListidItemByItemName())  
        {
         ItemprofilPk.setItemId(val);
         ItemprofilPk.setProfilId(user.getProfilUserId());
         Itemprofil.setAssociationItemProfilPK(ItemprofilPk);
         }  
          em.persist(Itemprofil);
          entr.commit();
    }
    catch (Exception e )
    {
        System.out.println(e.getMessage());
        System.out.println("Failed");
    }
    finally {
        em.close();
        emf.close();
    }
}



public ArrayList<Integer> getListidItemByItemName()
{
   try{
   EntityTransaction entityTrans=emm.getTransaction();
   entityTrans.begin();
      for (String val : listItem)  
      {
       System.out.println("my values"+val);
       javax.persistence.Query multipleSelect= em.createQuery("SELECT i.ItemId FROM Item i WHERE i.ItemName IN (:w)" );
       multipleSelect.setParameter("w", val);
       List ItemId =  new LinkedList();
       ItemId= multipleSelect.getResultList();
       listIdItem = new ArrayList(ItemId);
      }    
      entityTrans.commit();
      System.out.println("Id for given item name"+listIdItem);
      return listIdItem;
     }

     catch(Exception e)
    {
       e.printStackTrace();
    }

1 Ответ

1 голос
/ 20 августа 2011

Есть несколько проблем с вашим кодом.

Первый: вы не уважаете соглашения об именах. переменные должны начинаться со строчной буквы. Это делает ваш код труднее читать для опытных Java-программистов.

Второй: вы перебираете свои идентификаторы предметов и меняете значения ваших ItemprofilPk и Itemprofil объектов. Но вы обновляете всегда одни и те же объекты и сохраняете элемент только после цикла. поэтому, конечно, сохраняется только последнее значение. Измените что-то вроде этого:

for (Integer val : getListidItemByItemName()) {
    AssociationItemProfilPK itemprofilPk = new AssociationItemProfilPK();
    AssociationItemProfil itemprofil = new AssociationItemProfil();

    itemprofilPk.setItemId(val);
    itemprofilPk.setProfilId(user.getProfilUserId());
    itemprofil.setAssociationItemProfilPK(itemprofilPk);
    em.persist(itemprofil);
}

Третий: ваше отображение более сложное, чем нужно для id. У вас не должно быть объекта для сопоставления таблицы ассоциации. Вместо этого у вас должен быть список элементов в сущности ProfilUser и список profilUsers в сущности Item:

public class ProfilUser {

    @ManyToMany
    @JoinTable(
        name = "associationProfileUserItem",
        joinColumns = @JoinColumn(name = "PROFIL_ID"),
        inverseJoinColumns=@JoinColumn(name="ITEM_ID")
    private List<Item> items;

}

public class Item {
    @ManyToMany(mappedBy = "items")
    private List<ProfilUser profilUsers;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...