Spring Boot 2休眠更新未插入

Spring Boot 2休眠更新未插入,spring,hibernate,spring-boot,jpa,Spring,Hibernate,Spring Boot,Jpa,我正在尝试更新数据库中已存在的对象。保存对象可以正常工作,但在调用更新时,我的日志显示select语句,但不显示update。下面是我的代码 实体 @Entity @Table(name = "items") public class Items implements Serializable { private static final long serialVersionUID = -3607451001182083512L; @Id

我正在尝试更新数据库中已存在的对象。保存对象可以正常工作,但在调用更新时,我的日志显示select语句,但不显示update。下面是我的代码

实体

  @Entity
    @Table(name = "items")
    public class Items implements Serializable {
        private static final long serialVersionUID = -3607451001182083512L;

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer iditems;

        @ManyToOne
        @JoinColumn(name = "idcategories")
        private Categories categories;

        @Size(min = 1, max = 35)
        private String name;

        @Size(min = 0, max = 100)
        private String description;

        private double price;
        private int hidden;
        private String upc;

        @OrderColumn
        @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.LAZY)
        @JoinTable(name = "itemsextrascat", joinColumns = { @JoinColumn(name = "iditems") }, inverseJoinColumns = { @JoinColumn(name = "idextrascat"), })
        private Set<Extrascat> extrascat = new HashSet<Extrascat>();



    Getters and Setters
    }


我尝试过使用“保存更新”“持久化”“合并全部”,但没有效果。我还试着根据我在其他帖子上读到的内容更改我的@Transactional所在的位置。我还确保我的方法不是私人的,以确保“Transational”被激活。我能够通过实现一个允许我更新实体的存储库来解决这个问题。然而,我并不想在代码中同时使用DAO和存储库。关于Dao实现不起作用的原因,你有什么想法吗?

你把Dao弄得太复杂了。首先,为什么要使用原生hibernate,而普通的EntityManager就足够了。为什么要使用EntityManager工厂来管理您自己的EntityManager。最后,您处于Spring管理的环境中,不要使用openSession或createEntityManager,因为这将使您成为非事务性环境

也就是说,您可以删除大部分代码

@Transactional
@Component("itemsDao")
public class ItemsDao {

    @PersistenceContext
    private EntityManager em;


    // CREATE OR UPDATE ITEM
    @PreAuthorize("hasRole('ADMIN')")
    public void update(Items items) {
       em.merge(items);
    }
}
这就是你所需要的。基本上不要使用openSession,因为这将为hibernate提供一个新的会话。如果你做得足够多,最终你也会得到一个没有响应的应用程序,因为所有的数据库连接都被使用了。这是因为您正在打开会话,但从未关闭它

然而,我建议您使用SpringBoot和JPA来简单地使用SpringDataJPAEN,让它来处理所有这些

public interface ItemsRepository extends CrudRepository<Items, Long> {}

然后在您的代码中,只需对ItemsRepository和Spring数据调用save方法,JPA就会为您完成所有令人讨厌的事情

我正在更新一个旧的应用程序,它首先是在spring框架和hibernate 3或4上构建的。当我第一次更新到SpringBoot2时,我试图粗略地让一切正常工作,需要一个会话。你的解决方案有效。谢谢你用外行的语言解释这个问题。
@Transactional
@Component("itemsDao")
public class ItemsDao {

    @PersistenceContext
    private EntityManager em;


    // CREATE OR UPDATE ITEM
    @PreAuthorize("hasRole('ADMIN')")
    public void update(Items items) {
       em.merge(items);
    }
}
public interface ItemsRepository extends CrudRepository<Items, Long> {}