2012-09-15 3 views
2

@ConversationScoped bean을 가진 Seam 3/JBoss/Hibernate 프로젝트가 있습니다. 이 빈은 @Entity의 작성/편집을 관리합니다. 엔티티에 대한 변경 사항을 저장하고 현재 페이지에 사용자를 유지하고 싶습니다.Seam 3/Hibernate에서 DB로 플러시하지 않는 엔티티로 변경

@Named 
@Stateful 
@ConversationScoped 
public class TeamManagementBean implements Serializable { 

    @PersistenceContext(type = PersistenceContextType.EXTENDED) 
    private EntityManager entityManager; 

    @Inject 
    Conversation conversation; 

    @Inject 
    FlushModeManager flushModeManager; 

    protected Team team; 

    @Inject 
    @CurrentUser 
    private User currentAccount; 

    @Begin 
    public void loadTeam(Team team) { 
     if(conversation.isTransient()) conversation.begin(); 
     flushModeManager.setFlushModeType(FlushModeType.MANUAL); 
     this.team = team; 
    } 


    public void save() { 
     if(team.isUnsaved()) entityManager.persist(team); 
     entityManager.flush(); 
    } 

save()가 호출되면, 대화의 엔티티 (즉 변경 대화와 웹 페이지에 표시된다. 그러나, 데이터가 데이터베이스에 기록되지 않는 경우에도 업데이트됩니다 나는 사이트의 다른 부분에

, 내가 save() 메소드가 호출되었을 때 faces-config.xml가 다른 페이지로 리디렉션함으로써 데이터베이스에 엔터티를 업데이트 할 수 있었다. 대화를 종료합니다.하지만 난 계속하고 싶습니다 이 엔티티를 저장할 때 같은 페이지의 사용자

답변

1

; 이 작업은 entityManager.find()을 사용하거나 쿼리를 사용하여 수행해야합니다. 엔티티는 entityManager.contains()를 사용하여 확인할 수 있습니다 현재 영속 컨텍스트, 예에 속하는 경우 최대 절전 모드는 데이터베이스를 업데이트합니다 :

public void save() { 
    ... 
    System.out.println("contains(): " + entityManager.contains(team)); 
    entityManager.flush(); 
} 

가능하면 System.out.println()에 대한 호출은 물론 로깅 기능을 사용하여 교체해야합니다 .

엔터티가 loadTeam()으로 전달되기 전에 분리 된 경우 entityManager.merge()을 사용해야합니다.

0

트랜스를 사용하지 않는 경우 CUDION, CUD operatoins는 비즈니스 계층 객체에서 수행됩니다. CUD 조작을 수행하기 전에 트랜잭션을 시작해야하며 완료 후 완료 (또는 플러시)하십시오.

이 시도 : 자세한 내용은

entityManager.getTransaction().begin(); 
entityManager.persist(team); 
entityManager.getTransaction().commit(); 

: http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html 그것은이 loadTeam()에 전달 될 때 개체가로드 방법에 따라 달라집니다

+0

내가 명확히하지 않은 것처럼 보입니다. 위의 코드에서 영속성이 잘 작동합니다. 나는 새로운'Team'을 만드는 메소드를 생략하고 새로운'Team'을 생성하고 저장하면'persist() '를 사용하여) DB에 잘 씁니다. 문제는 이미 DB에있는 엔티티를 업데이트하려고 할 때입니다. – jcavazos

+0

엔티티를 업데이트하기 위해 persist()를 사용합니까? –

+0

아니요, 아닙니다. persist()는 새로 생성 된 엔티티를 데이터베이스에 저장하는 용도로만 사용되었다고 생각했습니다. – jcavazos

관련 문제