2009-08-25 13 views
2

"Pagina"と呼ばれるこのエンティティクラスがあり、エンティティの変更に基づいてデータベース内のエントリを更新したいとします。これは動作していません。エラーは出ませんが、dbは変更されません。別のクラスにおいてjpa/hibernateを使用したエンティティ更新の問題

@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] 

Iは、エンティティ上で動作メソッドを含むクラスで定義されたメソッドを使用して、データベース(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に ""というエントリがあります 私を助けることができますか?私はこれを解決する方法を知らない...私は必要に応じて変更することができます。

+0

私はあなたと同じ問題を抱えています。あなたの問題解決方法を教えてください。ありがとうございます –

答えて

6

Hibernateを大きなキャッシュと考えると、は、のように、キャッシュにもう収まらないものを置く「ストア」としてDBを使用します。あなたがそれを変更すると、HibernateはDBにすべてをフラッシュしません、それは待つでしょう。 1つのオブジェクト内で複数のフィールドを変更する可能性があります。

セッションをフラッシュする(em.flush())か、クエリを実行するか、現在のトランザクションをコミットする必要があります(Springを使用する場合は簡単なオプションではありません)。

+0

私はそのような騒ぎです、ありがとう! – Raffo

+0

hibernateは、データをデータベースに送信する時間を制限しようとします。透過的な永続性を採用しています。 –

0

プロパティの値を設定すると、すぐに変更がデータベースにフラッシュされません。トランザクションがコミットされた時点(または場合によってはそれ以前)に発生します。トランザクションをコミットして、データベースを確認してください。

関連する問題