2013-04-22 101 views
0

我有使用EntityManager persist()方法的問題。 我使用JSF2.0,glassfish 3,JPA和hibernate,我不使用spring。EntityManager persist()方法不插入記錄到數據庫=> SEVERE:javax.persistence.TransactionRequiredException

我嘗試添加事件與方法的事件表堅持下去,但EntityManager的persist()方法不插入記錄到數據庫中,我有此錯誤信息=>

重度:javax.persistence.TransactionRequiredException 在com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:163) 在com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush(EntityManagerWrapper.java:411) 在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(); 
    } 

} 

}

所以,這是行不通的,但編程'的fonction addEvenement,FacesMessage就會消息=新的FacesMessage輸入( 「EvenementajoutéAVEC更迭。」);將消息返回給我,好像它在工作。 我這是因爲我的entityMAnager,但實際上ohter函數適用於同一個實體管理器,所以我不明白。

**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」,查詢=「SELECT EVNT FROM TEvenement EVNT 「), @NamedQuery(名稱=」 TEvenement.findPrivateOther」,查詢= 「SELECT EVNT FROM TEvenement EVNT WHERE evnt.typeEvenement = 6 OR evnt.typeEvenement = 7」)}) 公共類TEvenement實現Serializable {

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

}

有沒有人有一個想法我錯過了什麼?

回答

2

區別不在於你調用persist,不同之處在於你調用em.flush()作爲錯誤狀態,要求將EntityManager加入到事務中。確保您的getListeEvenement()方法被封裝在一個事務中,或者根據您的設置啓動一個方法。

+0

有許多在服務器上獲取或啓動事務的示例。一個簡單的例子就是在你的bean中使用@TransactionAttribute(TransactionAttributeType.REQUIRED),這裏描述了一些其他的例子http://en.wikibooks.org/wiki/Java_Persistence/Transactions – Chris 2013-04-22 18:22:54

+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 2013-04-22 21:08:02

相關問題