使用JPA/Hibernate更新实体时出现问题

3

我有一个实体类,叫做“Pagina”,我想根据对实体所做的更改更新数据库中的条目。但是这并没有起作用。我没有收到任何错误信息,但数据库没有发生变化。

@Entity
@Table(name = "PAGINA")
@NamedQueries({@NamedQuery(name = "Pagina.findAll", query = "SELECT p FROM Pagina p"), 
@NamedQuery(name = "Pagina.findHashByURL", query= "SELECT p.chash FROM Pagina p WHERE p.url = :url"),
@NamedQuery(name = "Pagina.findTimestampByURL", query= "SELECT p.timestamp FROM Pagina p WHERE p.url = :url"),
@NamedQuery(name = "Pagina.findByUrl", query = "SELECT p FROM Pagina p WHERE p.url = :url"),
@NamedQuery(name = "Pagina.findByProfondita", query = "SELECT p FROM Pagina p WHERE p.profondita = :profondita"),
@NamedQuery(name = "Pagina.findByIntervallo", query = "SELECT p FROM Pagina p WHERE p.intervallo = :intervallo"),
@NamedQuery(name = "Pagina.findByTimestamp", query = "SELECT p FROM Pagina p WHERE p.timestamp = :timestamp"), 
@NamedQuery(name="Pagina.findAllURL", query="SELECT p.url FROM Pagina p"),
@NamedQuery(name="Pagina.findDelayByURL", query="SELECT p.intervallo FROM Pagina p WHERE p.url = :url"),
@NamedQuery(name = "Pagina.findByUpdated", query = "SELECT p FROM Pagina p WHERE p.updated = :updated")})
public class Pagina implements Serializable, Delayed{
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "URL")
    private String url;
    @Column(name = "PROFONDITA")
    private Integer profondita;
    @Column(name = "INTERVALLO")
    private Integer intervallo;
    @Lob
    @Column(name = "CHASH")
    private String chash;
    @Column(name = "TIMESTAMP")
    private Integer timestamp;
    @Column(name = "UPDATED")
    private Boolean updated;


[cut]

在另一个类中,我使用包含对实体进行操作的方法的类中定义的方法从数据库(mysql)检索存储的对象。此方法使用查询“findAll”。该方法的代码如下:

public List<Pagina> findAll(){
EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("CrawlerPU");
        EntityManager em = emf.createEntityManager();  
List o = (List) em.createNamedQuery("Pagina.findAll").getResultList();
        return o;
    }

我正在使用这种方法,正如您在代码中所看到的:
 PaginaMethods p = new PaginaMethods();

        List<Pagina> l = p.findAll();
   while (it.hasNext()) {
            Pagina s = (Pagina) it.next();
            s.setUpdated(Boolean.TRUE);

如果我观察数据库,发现在这些操作之后没有任何变化。我的persistence.xml文件中有这样一条记录:“false”。你能帮我吗?我不知道该如何解决...如果需要,我可以进行更改。

我和你有同样的问题,能否知道你是如何解决这个问题的?谢谢。 - Youcef LAIDANI
2个回答

8
把Hibernate看作是一个大型缓存,可以使用数据库作为“存储库”,把无法适应缓存的内容放入其中。当您更改内容时,Hibernate不会立即将所有内容刷新到数据库中,而是等待。您可能会更改对象中的多个字段。
因此,您需要刷新会话(em.flush()),或者必须运行查询,或者必须提交当前事务(在使用Spring时不是一个简单的选项)。

Hibernate试图限制向数据库发送内容的次数 - 它采用透明持久化。 - Michael Wiles

0

当您设置属性的值时,更改不会立即刷新到数据库中。它会在事务提交时(或某些情况下更早)发生。尝试提交事务,然后检查数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接