2016-08-18 7 views
0

내 J2EE 응용 프로그램의 데이터베이스에서 기본 CRUD 작업에 문제가 있습니다.내 update() 메소드가 새 인스턴스를 만드는 이유는 무엇입니까?

엔터티 :

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "shop_id") 

외관 :

public abstract class AbstractFacade<T> { 

private Class<T> entityClass; 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 
} 

컨트롤러 (나는 S.out의이 어떻게되는지에 추가) : 내가 업데이 트를 클릭하면

public String updateShop(Shop shop){ 
    System.out.println("Update "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shop = shop; 
    return "updateShop"; 
} 

public String updateShop(){ 
    System.out.println("UpdateClick "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shopfacade.edit(this.shop); 
    return "shops"; 
} 

을 그리고 새 인스턴스가 기존 인스턴스를 수정하는 대신 만들어집니다. 다음은 서버의 로그 출력입니다.

Info: Update 
Info: Name - 41 
Info: UpdateClick 
Info: ChangedName - null 

그래서이 ID는 사라집니다. 이 문제는 updateShop()을 호출 할 때 발생합니다. JSF 페이지에 ID를 표시하고 정상적으로 작동하기 때문입니다.

<h:outputText value="#{shopController.shop.shopId}" title="shopId" /> 

어떤 생각입니까?

감사합니다.

+0

우리는 그 가게에 무엇이 바인딩되어 있는지 알기 위해 나머지 jsf를 볼 필요가 있습니다. – Miles

+0

Jsf의 일반적인 문제입니다. Object를 제대로 바인드하지 않았다면. 문제가 해결되지 않았다면 JSF 코드와 컨트롤러를 올바르게 게시하십시오. –

답변

0

문제 중 하나는 javax.persistence.EntityManager.merge이 코드가 무시하는 개체 개체를 반환한다는 것입니다.

이 반환 된 엔터티는 전달한 것과 동일 할 수도 있고 그렇지 않을 수도 있습니다. 일반적으로 현재의 지속성 컨텍스트에 이미 전달 된 엔터티에 대한 참조가 있으면 반환되는 엔터티가됩니다.

public String updateShop(){ 
    System.out.println("UpdateClick "); 
    System.out.println(this.shop.getName()+" - ID: "+ this.shop.getShopId()); 
    this.shop = this.shopfacade.edit(this.shop); 
    return "shops"; 
} 

둘째, merge에 기본 키없이 엔티티 빈을 통과하는 것은 효과적으로 persist로 전달과 동일합니다 : 따라서

, updateShop()은 아마 무언가 같이해야합니다. 따라서 JSF가 new 일 경우 자신이 Shop 객체이므로 기존 객체를 제공하지 않았기 때문에보고있는 중복 효과를 얻을 수 있습니다.