Проблема с обновлением Entity с помощью jpa/hibernate

У меня есть этот класс сущностей под названием «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 есть запись "" Вы можете мне помочь? Я не знаю, как это решить... Я могу изменить ситуацию, если это необходимо.


person Raffo    schedule 25.08.2009    source источник
comment
у меня такая же проблема как у вас, могу я узнать как вы решили свою проблему пожалуйста. благодарю вас   -  person YCF_L    schedule 22.10.2016


Ответы (2)


Думайте о Hibernate как о большом кеше, который может использовать БД как «хранилище», куда он помещает вещи, которые больше не помещаются в кеш. Hibernate не будет сбрасывать все в БД, когда вы его измените, он будет ждать. Скорее всего, вы можете изменить более одного поля в объекте.

Итак, вам нужно сбросить сессию (em.flush()), или вы должны выполнить запрос, или вы должны зафиксировать текущую транзакцию (нелегкий вариант при использовании Spring).

person Aaron Digulla    schedule 25.08.2009
comment
hibernate пытается ограничить количество раз, когда он отправляет данные в базу данных - он использует прозрачное постоянство. - person Michael Wiles; 26.08.2009

Изменения не сбрасываются в базу данных сразу после установки значения свойства. Это происходит во время фиксации транзакции (или раньше в некоторых случаях). Попробуйте зафиксировать транзакцию, а затем проверьте базу данных.

person Rob H    schedule 25.08.2009