数据库中的更新未反映在 JPA 实体中

Bab*_*ily 1 persistence jpa eclipselink jakarta-ee

我正在将 EclipseLink 用于 JPA 持久性,而且我对这项技术非常陌生。我遇到了一种情况,我不得不更新 oracle 数据库中表中的一个条目,并且我在数据库中成功提交了此更新,但它没有反映在 JPA 实体中,这意味着我无法在前端看到数据,但是一旦我重启tomcat服务器,就可以看到前端的数据了。有人请帮助我后端发生了什么。

提前致谢!

安全数据表

import java.util.Date;
@Entity
@Table(name="SDS")
@XmlRootElement
public class SDS {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long sdsId;

@Column
private String sdsNumber;

@Column
private String sdsName;


@Column
private String sapId;



@Column(name = "DATE_FIELD")
@Temporal(TemporalType.TIMESTAMP)
private Date sdsDate;



public SDS() {}


public Long getSdsId() {
    return sdsId;
}

public void setSdsId(Long sdsId) {
    this.sdsId = sdsId;
}

public String getSdsNumber() {
    return sdsNumber;
}

public void setSdsNumber(String sdsNumber) {
    this.sdsNumber = sdsNumber;
}

public String getSdsName() {
    return sdsName;
}

public void setSdsName(String sdsName) {
    this.sdsName = sdsName.substring(0, Math.min(sdsName.length(), 254));
    //this.sdsName = sdsName;
}


public Date getSdsDate() {
    return sdsDate;

}


public void setSdsDate(Date sdsDate) {
    this.sdsDate = sdsDate;
}
 }
Run Code Online (Sandbox Code Playgroud)

数据库更新:

update SDS set date_field='10-FEB-2017' where sdsid=1102
Run Code Online (Sandbox Code Playgroud)

小智 5

更新可能不会反映出来,因为当您使用 EntityManager 的“查找”方法获取实体时,EntityManager 会在持久性上下文中找到它,而不是在数据库中。

如果实体实例包含在持久化上下文中,则从那里返回

entityManager.refresh(entity) 为我同步了实体与数据库。

entityManager.flush() 不起作用(即使提交了所有内容)。

entityManager.clear() 或从 EntityManagerFactory 获取新的 EntityManager 也没有帮助。

当您在 SQL SELECT 中使用“createNativeQuery”而不是“find”方法时,似乎也会发生同样的情况。

哦!看我发现了什么。

默认情况下,EclipseLink 使用共享对象缓存,该缓存缓存为持久性单元读取和持久化的所有对象的子集。EclipseLink 共享缓存不同于本地 EntityManager 缓存。共享缓存在持久性单元(EntityManagerFactory,或服务器)的持续时间内存在,并由持久性单元的所有 EntityManager 和用户共享。本地 EntityManager 缓存不共享,仅在 EntityManager 或事务期间存在。

也可以禁用共享缓存。

属性名称="eclipselink.cache.shared.default" 值="false"