使用jpa/hibernate更新实体的问题 [英] Problem with Entity update with jpa/hibernate

查看:62
本文介绍了使用jpa/hibernate更新实体的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个称为"Pagina"的实体类,我想根据对该实体所做的更改来更新数据库中的条目.这不起作用.我没有收到任何错误,但数据库未更改.

I have this entity class, called "Pagina" and I want to update the entry in the database based on the changes made to the entity. This isn't working. I get no errors, but the db is not changed.

@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".该方法的代码如下:

In another class I retrieve the objects stored in the database (mysql) using a methods defined in a class that contains methods that work on the entity. This method use the query "findAll". The method's code is the following:

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;
    }

正如您在代码中看到的那样,我正在使用此方法:

I'm using this method as you can see in the code:

 PaginaMethods p = new PaginaMethods();

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

如果我观看数据库,则此操作后没有任何变化.我的persistence.xml的条目为" 你能帮助我吗?我不知道该如何解决...如果需要的话,我可以更改.

If I watch the db, nothing has changed after this operations. My persistence.xml has the entry " " Can you help me? I don't know how to solve this... I can change things if needed.

推荐答案

将Hibernate视为大型缓存,可以将DB用作存储",在其中放置不适合的内容进入缓存了.更改时,Hibernate不会将所有内容刷新到数据库,而是会等待.可能您可能会更改对象中的多个字段.

Think of Hibernate as a big cache that can use a DB as a "store" where it puts things that don't fit into the cache anymore. Hibernate will not flush everything to the DB as you change it, it will wait. Chances are that you might change more than a single field in an object.

因此,您需要刷新会话(em.flush()),或者必须运行查询,或者必须提交当前事务(使用Spring时,这不是一个简单的选择).

So you need to flush the session (em.flush()), or you must run a query, or you must commit the current transaction (not an easy option when using Spring).

这篇关于使用jpa/hibernate更新实体的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆