JPA查询有时返回不完整的结果,尽管数据库是正确的

JPA查询有时返回不完整的结果,尽管数据库是正确的,jpa,eclipselink,Jpa,Eclipselink,我的web服务出现了一些奇怪的行为。我用jersey来表示JAXRS,用eclipselink来表示JPA。我怀疑问题出在JPA身上。简而言之,我有两个实体:历史和挑战 @XmlRootElement @Entity public class History { @Column @Id @GeneratedValue(strategy = GenerationType.AUTO) public long id; @JoinColumn @Man

我的web服务出现了一些奇怪的行为。我用jersey来表示JAXRS,用eclipselink来表示JPA。我怀疑问题出在JPA身上。简而言之,我有两个实体:历史和挑战

@XmlRootElement
@Entity
public class History {

    @Column
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long id;

    @JoinColumn
    @ManyToOne
    public Challenge challenge;

    public History() {
    }
}

@XmlRootElement
@Entity
public class Challenge {

    @Column
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long id;

    @Column(length = 255)
    public String title;

    @Column(length = 1000)
    public String description;

    public Challenge() {
    }
}
历史记录和挑战的所有条目都存在于数据库中,不会更改。通常,当我查询所有历史记录时,我会返回所有条目,并且每个历史记录都附带一个挑战。但是,有时,挑战成员的一个或两个历史记录条目为null(尽管db的顺序很好)。如果我在Tomcat中重新加载应用程序,查询再次正常工作。稍后,此错误再次出现。所以我猜这与我如何使用EntityManager有关。以下是查询所有历史记录的代码:

public List<History> getHistories() {
        EntityManager em = emFactory.createEntityManager();
        Query query = em.createQuery("SELECT h FROM History h");
        List<History> list = (List<History>) query.getResultList();
        em.close();

        return list;
    }
public List getHistories(){
EntityManager em=emFactory.createEntityManager();
Query Query=em.createQuery(“从历史h中选择h”);
List=(List)query.getResultList();
em.close();
退货清单;
}

正如我前面所说,历史和挑战不会改变。然而,我有一些其他实体引用历史,也许我在其他地方做了一些事情,触发了这个问题。我应该在方法中调用em.clear()还是em.flush()?在我为每个请求创建一个实体管理器的情况下是否有必要?

EclipseLink默认启用共享缓存

看,,


似乎你已经不知何故损坏了你的对象。可能在创建对象时没有设置manyTone。或者在应用程序中将其设置为null?

因此,即使我为每个请求创建单独的EntityManager,所有请求都使用相同的缓存来获取数据?例如,如果我创建了一个名为Stat的实体的新实例,该实体与历史有@ManyToOne关系,但我只将历史的id字段设置为数据库中现有的id字段(我禁用了级联,因此不会影响历史记录条目),当我稍后获取具有该id的历史记录时,它将为我获取一个历史实体,该实体的所有值都为null,除了id?我怀疑这是我的案子。只要确认一下,如果我的意思清楚的话。是的。为现有对象创建对象是错误的。必须使用find()获取现有对象。您还可以使用getReference()来避免数据库访问。