Spring Boot 2休眠更新未插入
我正在尝试更新数据库中已存在的对象。保存对象可以正常工作,但在调用更新时,我的日志显示select语句,但不显示update。下面是我的代码 实体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
@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> {}