2013-04-22 2 views
0

EntityManager persist() 메소드 사용에 문제가 있습니다. JSF2.0, glassfish 3, JPA 및 최대 절전 모드를 사용 중입니다. 스프링을 사용하지 않습니다.EntityManager의 persist() 메소드는 데이터베이스에 레코드를 삽입하지 않습니다. => SEVERE : javax.persistence.TransactionRequiredException

나는 방법과 이벤트 테이블에 이벤트를 추가하려고 계속하지만, EntityManager의이 방법은 데이터베이스에 레코드를 삽입하지 않음) (계속 그리고 난이 오류 메시지가 =>

SEVERE : javax.persistence.TransactionRequiredException com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck (EntityManagerWrapper.java:163) at com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush (EntityManagerWrapper.java:411) at dao .EvenementDao.addEvenement (EvenementDao.java:128).

@ManagedBean 
@Stateless 
public class EvenementDao implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = -3343483942392617877L; 
/** 
* 
*/ 


private List<TEvenement> listeEvenement; 
private List<SelectItem> listeSelectItemEvnt; 
private TEvenement tevenement ; 




public EvenementDao() { 

} 


@PersistenceUnit(unitName="GA2010-ejbPU-dev") 
private EntityManagerFactory emf; 



@PostConstruct 
private void init() { 

    tevenement = new TEvenement(); 

} 



public List<TEvenement> getListeEvenement() { 
EntityManager em = emf.createEntityManager(); 
    TypedQuery<TEvenement> requete = m.createNamedQuery("TEvenement.findPrivateOther", 
    TEvenement.class); 
    listeEvenement = requete.getResultList(); 

    return listeEvenement; 
} 

public TEvenement getEvenement() { 
    return tevenement; 
} 



public void setEvenement(TEvenement evenement) { 
    this.tevenement = evenement; 
} 



public void addEvenement(){ 
    EntityManager em = emf.createEntityManager(); 
HttpSession session = (HttpSession) FacesContext.getCurrentInstance(). 
          getExternalContext().getSession(false); 
    Integer codeUser = (Integer) session.getAttribute("codeUser"); 
    tevenement.setUtilCreation(codeUser); 

    System.out.println("je rentre dans addevenemnt"); 
    try{ 




     System.out.println("i persist "+ em); 

      em.persist(tevenement); 
      em.flush(); 
     System.out.println(tevenement.getDetailsEvenement()); 

     FacesMessage message = new FacesMessage("Evenement ajouté avec succès."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 


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

} 

} 그래서

이 작동하지 않습니다,하지만 progam는 fonction의 addEvenement, FacesMessage 메시지 = 새로운 FacesMessage에 입력 ("Evenement ajouté AVEC SUCCES."); 그것이 작동하고있는 것처럼 메시지를 나에게 돌려줍니다. 그게 내 entityMAnager에 의한 것이지만 사실 오터 함수는 똑같은 엔티티 관리자와 잘 작동하므로 이해가 안됩니다.

**public List<TEvenement> getListeEvenement()** { 
    EntityManager em = emf.createEntityManager(); 
    TypedQuery<TEvenement> requete =  em.createNamedQuery("TEvenement.findPrivateOther", TEvenement.class); 
    listeEvenement = requete.getResultList(); 

    return listeEvenement; 
} 

이 하나가 잘 작동은 유일한 차이점은이 경우 조회가 선택이고 다른 경우에 그것은 그렇게 데이터베이스에 영향을 미칠 쿼리를 지속라는 것이다.

엔티티의 코드 :

@Entity @Table (이름 = "t_evenements") @NamedQueries ({NamedQuery (이름 = "TEvenement.findAll"@ 쿼리 = "TEvenement의 이벤트 녹화 FROM evnt (이벤트)를 선택 "), @NamedQuery (이름 ="TEvenement.findPrivateOther "쿼리 ="TEvenement의 이벤트 녹화 evnt.typeEvenement = 6 evnt.typeEvenement = 7 ")}) 공용 클래스 TEvenement가 구현 직렬화 {

private static final long serialVersionUID = -1908959833491896991L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="REF_EVENEMENT", unique=true, nullable=false) 
private Integer refEvenement; 

@Temporal(TemporalType.DATE) 
@Column(name="DATE_DEBUT_EVENEMENT") 
private Date dateDebutEvenement; 

@Temporal(TemporalType.DATE) 
@Column(name="DATE_FIN_EVENEMENT") 
private Date dateFinEvenement; 

@Column(name="DETAILS_EVENEMENT") 
private String detailsEvenement; 

@Column(name="IS_EVERYDAY") 
private byte isEveryday; 

@Column(name="RAPPEL_EVENEMENT") 
private int rappelEvenement; 

public Integer getUtilEvenement() { 
    return utilEvenement; 
} 

public void setUtilEvenement(Integer utilEvenement) { 
    this.utilEvenement = utilEvenement; 
} 

@Column(name="TITRE_EVENEMENT") 
private String titreEvenement; 

@Column(name="TYPE_EVENEMENT") 
private String typeEvenement; 

@Column(name="UTIL_COPIE_EVENEMENT") 
private Integer utilCopieEvenement; 

@Column(name="UTIL_EVENEMENT") 
private Integer utilEvenement; 

@Column(name="HEURE_EVENEMENT") 
private String heureEvenement; 

@Column(name="UTIL_CREATION") 
private Integer utilCreation; 


public String getHeureEvenement() { 
    return heureEvenement; 
} 

public void setHeureEvenement(String heureEvenement) { 
    this.heureEvenement = heureEvenement; 
} 

public TEvenement() { 
} 

public Integer getRefEvenement() { 
    return this.refEvenement; 
} 

public void setRefEvenement(int refEvenement) { 
    this.refEvenement = refEvenement; 
} 

public Date getDateDebutEvenement() { 
    return this.dateDebutEvenement; 
} 

public Integer getUtilCreation() { 
    return utilCreation; 
} 

public void setUtilCreation(Integer utilCreation) { 
    this.utilCreation = utilCreation; 
} 

public void setUtilCopieEvenement(Integer utilCopieEvenement) { 
    this.utilCopieEvenement = utilCopieEvenement; 
} 

public void setDateDebutEvenement(Date dateDebutEvenement) { 
    this.dateDebutEvenement = dateDebutEvenement; 
} 

public Date getDateFinEvenement() { 
    return this.dateFinEvenement; 
} 

public void setDateFinEvenement(Date dateFinEvenement) { 
    this.dateFinEvenement = dateFinEvenement; 
} 

public String getDetailsEvenement() { 
    return this.detailsEvenement; 
} 

public void setDetailsEvenement(String detailsEvenement) { 
    this.detailsEvenement = detailsEvenement; 
} 

public byte getIsEveryday() { 
    return this.isEveryday; 
} 

public void setIsEveryday(byte isEveryday) { 
    this.isEveryday = isEveryday; 
} 

public int getRappelEvenement() { 
    return this.rappelEvenement; 
} 

public void setRappelEvenement(int rappelEvenement) { 
    this.rappelEvenement = rappelEvenement; 
} 

public String getTitreEvenement() { 
    return this.titreEvenement; 
} 

public void setTitreEvenement(String titreEvenement) { 
    this.titreEvenement = titreEvenement; 
} 

public String getTypeEvenement() { 
    return this.typeEvenement; 
} 

public void setTypeEvenement(String typeEvenement) { 
    this.typeEvenement = typeEvenement; 
} 

public Integer getUtilCopieEvenement() { 
    return this.utilCopieEvenement; 
} 

public void setUtilCopieEvenement(int utilCopieEvenement) { 
    this.utilCopieEvenement = utilCopieEvenement; 
} 
로부터 evnt (이벤트)를 선택

}

아무에게도 내가 누락 된 아이디어가 있습니까?

답변

2

차이점은 계속 호출하지 않는다는 점입니다. 차이점은 오류 상태로 EntityManager를 트랜잭션에 조인해야한다는 em.flush()를 호출한다는 것입니다. getListeEvenement() 메서드가 트랜잭션에 래핑되었는지 확인하거나 설정에 따라 시작합니다.

+0

서버에서 트랜잭션을 가져 오거나 시작하는 많은 예제가 있습니다. 빠른 예제는 빈에서 @TransactionAttribute (TransactionAttributeType.REQUIRED)를 사용하는 것입니다. 여기에 설명 된 다른 예제가 있습니다. http://en.wikibooks.org/wiki/Java_Persistence/Transactions – Chris

+0

@TransactionAttribute (TransactionAttributeType.REQUIRED) => this 어쩌면 작동하지 않습니다. 왜냐하면 저는 클래스를 삽입하려고했기 때문에 인터페이스를 읽지는 않았지만 이것을 읽었습니다. 그러나 이것이 최신인지는 모르겠습니다. http://www.adam-bien.com/roller/abien/entry/no_xml_dependency_injection_jpa. 기사에서 : "일반적인 오류 : 당신은 EJB 3.0에서 클래스를 삽입 할 수 없지만 인터페이스 만이 EJB 3.1에서 변경됩니다 ..."여전히 사실입니까? – user2198685

관련 문제