Транзакционный метод не записывает обновления в базу данных - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над приложением Spring, которое использует Hibernate 4.3 для управления данными, хранящимися в базе данных MySql.

Я хочу просто обновить значение этого объекта:

@Table(name = "CONTENT")
public class KcContent {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    @DocumentId
    private Long id;

    @Column(name="PRIORITY")
    private Long priority;

    // getter and setter
}

Это точка, где я обновляю объект:


private EntityManager entityManager;

@Transactional
public String checkAndManageActionsNewsletter(NewsletterActionRequestBean requestBean) {
    List<String> newsIds = requestBean.getNewsIds();

    // update priority based on position in list
    for(long priority = 0; priority < newsIds.size(); priority++) {
        String newsId = newsIds.get((int) priority);
        long contentId = Long.parseLong(newsId);
        KcContent news = getServiceCatalog().getContentService().find(contentId);
        news.setPriority(priority);
    }
}

Где @Transactional импортируется из org.springframework.transaction.annotation.Transactional.

Этот код приводит к без обновления базы данных . Я также пытался добавить после setPriority():

  1. this.entityManager.merge(news)
  2. this.entityManager.persist(news)

, но это не работает.

Я проверил ссылку на объект в entityManager после метода setPriority() и обновил значение.

debug shell check

В базе данных вместо этого значение остается прежним (0):

enter image description here

В конце я попытался изменить значения в базе данных для приоритета, и приложение прочитало их правильно, поэтому проблема, похоже, связана только с обновлением.

Есть ошибки в конфигурации?

Примечание: к сожалению, я не могу использовать JpaRepository.


Обновление : Это реализация метода find() в классе ContentService:

public EntityManager getEntityManager() {
    return entityManager;
}

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

@Override
@Transactional(readOnly=true)
public KcContent find(Long id) {
    if (id == null){
        return null;
    }
    return getEntityManager().find(KcContent.class, id);
}
...