2011-08-20 3 views
0

나는 JPA를 사용하여 내 데이터베이스에 사용자와 그의 아이템 인 many-to-many 관계를 추가하는 함수를 가지고있다.JPA를 사용하여 데이터베이스에 값을 추가 할 때의 문제점

profilUser

항목

associationProfileUserItem

나는 사용자의 로그인 및 암호를 입력하고 나는 항목의 이름 목록을 선택 GUI에

, 내가 가진 worte : 나는 다음과 같은 테이블이 함수는 그들의 이름에 의해 Item의 id를 회복한다 (association에 추가하기 위해). 문제는 사용자가 마지막으로 선택한 항목을 삽입하고 나머지는 무시한다는 것입니다.

내 코드 :

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

이 코드 몇 가지 문제가 있습니다.

첫 번째 문제 : 명명 규칙을 존중하지 않습니다. 변수는 소문자로 시작해야합니다. 따라서 숙련 된 Java 프로그래머가 코드를 읽기가 어려워집니다.

둘째 : 항목 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); 
} 

세 번째 : 맵핑이 필요 이상입니다. 연관 테이블을 매핑 할 엔티티가 없어야합니다.

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

, 내가 시도 솔루션하지만 동일한 문제가 지속 : 대신, 따라서 ProfilUser 기업에 대한 항목의 목록 및 profilUsers의 목록 Item 엔티티에 있어야한다! – rym

관련 문제