2011-08-20 10 views
0

私は自分のデータベースに(JPAを使用して)ユーザーとそのアイテム、多対多関係を追加する機能を持っています。JPAを使用してデータベースに値を追加する際の問題

profilUser

項目

associationProfileUserItem

私は、ユーザーのログイン名とパスワードを入力し、私はアイテムの名前のリストを選択するGUI上の

、私が持っているworte:私は、次のテーブルを持っていますそれらの名前でItemのIDを回復する(アソシエーションに追加する)。 問題は、関数がユーザーのために選択された最後の項目を挿入し、残りを無視することです。

マイコード:

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つ:名前付け規則を尊重しません。変数は小文字で始まる必要があります。これにより、経験豊富なJavaプログラマーのためにコードを読みにくくなります。

2つ目:アイテムIDをループし、ItemprofilPkItemprofilオブジェクトの値を変更します。しかし、常に同じオブジェクトを更新し、ループの後でアイテムを永続化するだけです。もちろん、最後の値だけが保持されます。

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); 
} 

第3の1つ:あなたのマッピングはidの必要以上に複雑です。アソシエーションテーブルをマッピングするエンティティを持つべきではありません。代わりに、あなたは、このようにItemエンティティにProfilUserエンティティに項目のリストを持っている、とprofilUsersのリスト必要があります。

public class ProfilUser { 

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

} 

public class Item { 
    @ManyToMany(mappedBy = "items") 
    private List<ProfilUser profilUsers; 
} 
+0

、私はあなたのソリューションを試してみましたが、同じ問題が持続します! – rym

関連する問題