【问题标题】:EntityManager persist() method does not insert record to database => SEVERE: javax.persistence.TransactionRequiredExceptionEntityManager persist() 方法不向数据库插入记录 => 严重:javax.persistence.TransactionRequiredException
【发布时间】:2013-04-15 13:24:39
【问题描述】:

我在使用 EntityManager persist() 方法时遇到问题。 我正在使用 JSF2.0、glassfish 3、JPA 和 hibernate,我没有使用 spring。

我尝试使用 persist 方法在事件表中添加事件,但 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();
    }

}

}

所以,这是行不通的,但是程序在函数 addEvenement 中输入,FacesMessage message = new FacesMessage("Evenement ajouté avec succès.");将消息返回给我,就好像它正在工作一样。 我认为这是由于我的 entityMAnager 造成的,但实际上其他功能可以与同一个实体管理器一起正常工作,所以我不明白。

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

    return listeEvenement;
}

这个工作正常,唯一的区别是,在这种情况下,查询是一个选择,而在另一种情况下,它是一个持久化查询,因此会影响数据库。

实体代码:

@实体 @Table(name="t_evenements") @NamedQueries({@NamedQuery(name="TEvenement.findAll", query="SELECT evnt FROM TEvenement evnt"), @NamedQuery(name="TEvenement.findPrivateOther", query="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;
}

}

有人知道我错过了什么吗?

【问题讨论】:

    标签: jpa entity


    【解决方案1】:

    不同之处不在于您调用persist,不同之处在于您调用em.flush(),如错误所示,它要求将EntityManager 加入事务。确保您的 getListeEvenement() 方法包含在事务中,或者根据您的设置启动一个。

    【讨论】:

    • 有很多在服务器上获取或启动事务的例子。一个简单的示例是在您的 bean 中使用 @TransactionAttribute(TransactionAttributeType.REQUIRED) ,此处描述了一些其他示例 en.wikibooks.org/wiki/Java_Persistence/Transactions
    • @TransactionAttribute(TransactionAttributeType.REQUIRED) => 这不起作用也许是因为我试图注入一个类而不是一个接口我读了这个但我不知道它是否是最新的== > adam-bien.com/roller/abien/entry/… 。在文章中说:“常见错误:您不能在 EJB 3.0 中注入类,而只能注入接口。这将在 EJB 3.1 中改变......”这仍然是真的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多