Проблема с обновлением Entity с помощью jpa / hibernate - PullRequest
3 голосов
/ 25 августа 2009

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

Ответы [ 2 ]

7 голосов
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...