当前位置: 首页 > 知识库问答 >
问题:

JTA Eclipselink在提交后不更新实体

微生恩
2023-03-14

我在JTA和Wildfly8中使用Eclipselink,问题是在提交用户事务并将数据插入数据库后,它不会更新相关实体,所以如果我重新加载页面或打开页面的新实例,它加载数据时不会插入行。

@ManagedBean
@ViewScoped
public class empcreator {

UserTransaction ut=null;

@PersistenceContext(unitName="game")
private EntityManager em;

Context icontext=null;
public empcreator() throws NamingException{
    icontext=new InitialContext();
    ut=(UserTransaction)icontext.lookup("java:comp/UserTransaction");
}
    public void addElementToIsland() throws NamingException, NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException{
    int objectid=Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("objectid"));
    int x=Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("x"));
    int y=Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("y"));
    int z=Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("z"));
    int r=Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("r"));
    int islid=selectedisland;

    Query q=em.createNamedQuery("Element.findOne");
    q.setParameter("id", objectid);
    Element element=(Element)q.getResultList().get(0);

    q=em.createNamedQuery("Island.findOne");
    q.setParameter("islandid", islid);
    Island isl=(Island)q.getResultList().get(0);

    islandsobjects el=new islandsobjects();
    el.setElement(element);
    el.setX(x);
    el.setY(y);
    el.setZ(z);
    el.setR(r);
    el.setIsland(isl);

    ut.begin();
    em.persist(el);
    ut.commit();
}
    public void loadIsland(ActionEvent e){
    Query q=em.createNamedQuery("Island.findOne");
    q.setParameter("islandid", selectedisland);
    List<islandsobjects> iobjects=((Island)q.getResultList().get(0)).getIobjects();
    JsonObjectBuilder jsonOB=Json.createObjectBuilder();
    JsonArrayBuilder jsonAB=Json.createArrayBuilder();
    for(int i=0;i<iobjects.size();i++){
        jsonOB.add("id", iobjects.get(i).getId());
        Element element=iobjects.get(i).getElement();
        jsonOB.add("name", element.getName());
        jsonOB.add("x", iobjects.get(i).getX());
        jsonOB.add("y", iobjects.get(i).getY());
        jsonOB.add("z", iobjects.get(i).getZ());
        jsonOB.add("r", iobjects.get(i).getR());
        jsonOB.add("objectid", iobjects.get(i).getObjectid());
        jsonOB.add("islandid", selectedisland);
        jsonAB.add(jsonOB);
    }
    JsonObject jsElements=Json.createObjectBuilder().add("elements", jsonAB).build();
    RequestContext.getCurrentInstance().execute("loadisland("+jsElements.toString()+")");
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="game" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:jboss/datasources/boddooo</jta-data-source>
    <class>boddooo.entity.Empire</class>
    <class>boddooo.entity.Empiresobject</class>
    <class>boddooo.entity.Island</class>
    <class>boddooo.entity.Element</class>
    <class>boddooo.entity.User</class>
    <class>boddooo.entity.World</class>
    <class>boddooo.entity.islandsobjects</class>
      <properties>
          <property name="eclipselink.target-server" value="JBoss"/>
          <property name="eclipselink.logging.level" value="FINE"/>
          <property name="eclipselink.persistence-context.flush-mode" value="auto" />
      </properties>
</persistence-unit>
</persistence>

共有1个答案

席弘图
2023-03-14

当我禁用缓存时,它解决了问题,但变得更慢,然后我使用这个

query.setHint("javax.persistence.cache.storeMode", "REFRESH");

它在没有禁用缓存的情况下更新了数据

 类似资料:
  • 审议本届会议: 这是一个在数据库中显示用户图像的图像,带有会话变量!然而,在我的网站中,我正在使用上传图像表单更改用户图片,用户图片正在更新,但旧图片将保留,直到我刷新页面…我希望避免刷新页面以解决此问题。。。。 请注意,我的目标是一个iframe,而不是重定向到我的操作。。。 这是我的上传表格,你可能不需要,但我会把它放在这里... 例如: 使现代化php示例 所以为了简单起见,我想在提交表单时

  • 我在我的GAE数据存储实验中发现了一些很奇怪的东西。我使用的是GAE SDK 1.7.5。我不确定我的发现是否正确。 基本上,我发现在执行数据存储get之前,将实体放入数据存储并进行计数不会返回正确的值。 如果你想更深入地挖掘,这里是我前面的SO问题中的实际代码:

  • 为什么在刷新页面后重新提交 去http://qass.im/message-envelope/ 并上传任何文件,但仅限文本"gif","jpeg","jpg","png","zip","pdf","docx","rar","txt" 上传后点击F5按钮刷新页面 现在重新提交并重新上传文件! 为什么呢? 我想在上传文件后禁用重新提交而不使用jquery

  • 我有 在我的构建中。gradle我有 但是尽管成功了-到我的数据库中,它并没有添加任何新表。我有postreSQL,其中包含我所有表所在的方案- 我的控制台输出

  • 情况: 我有两个与OneTomany/ManyToone关系相关的实体。 想象一下,每个类也有一个名为id和getter和setter的PK。 问题: 如果我创建一个EntityA实例并设置一个与已经存在的EntityB实例的关系并持久化这个新实例,那么所有数据都会正确地保存到数据库中。但是,如果我从我的EntityManager请求EntityB的实例,它的列表中将不包含刚刚持久化的Entity

  • 我在hibernate search 6中使用elasticsearch时遇到了问题。让我们假设我们有这样的设置: } } 当我第一次持久化EntityA(即被索引的实体)时,EntityB作为EntityA的子实体持久化在elasticsearch索引中。这是可以的。当我直接编辑EntityB并对其进行更改时,问题出现了,这种更改没有传播到elasticsearch索引。我错过了什么吗? 更新1