Hibernate 如何修复';没有实际交易的entitymanager';何时调用deleteallby方法?
我正在构建一个spring boot后端,希望创建一个rest端点,该端点根据供应商id删除所有项目。当我调用rest端点时,我得到“没有entitymanager,实际事务可用”异常 如何修复此错误 我尝试了Hibernate 如何修复';没有实际交易的entitymanager';何时调用deleteallby方法?,hibernate,spring-boot,jpa,Hibernate,Spring Boot,Jpa,我正在构建一个spring boot后端,希望创建一个rest端点,该端点根据供应商id删除所有项目。当我调用rest端点时,我得到“没有entitymanager,实际事务可用”异常 如何修复此错误 我尝试了@Transactional年金,但仍然出现错误 型号: public class Item { public Item() {} @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Colu
@Transactional
年金,但仍然出现错误
型号:
public class Item {
public Item() {}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ItemId")
private int id;
public int getId() {
return this.id;
}
public void setId(int Id) {
this.id = Id;
}
@Column(name = "Suppid")
private int suppid;
public int getSuppid() {
return this.suppid;
}
public void setSuppid(int Suppid) {
this.suppid = Suppid;
}
}
存储库:
public interface ItemRepository extends CrudRepository<Item, Integer> {
@Transactional
public void deleteAllBySuppid(int suppid);
}
public interface ItemRepository extends CrudRepository<Item, Integer> {
public void deleteAllBySuppid(int suppid);
}
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.0.Final</version>
</dependency>
</dependencies>
好吧,这是我的错误,因为我把
@Transactional
放错地方了。我必须将年金放在我的控制器中的方法上,而不是放在积存库中
存储库:
public interface ItemRepository extends CrudRepository<Item, Integer> {
@Transactional
public void deleteAllBySuppid(int suppid);
}
public interface ItemRepository extends CrudRepository<Item, Integer> {
public void deleteAllBySuppid(int suppid);
}
要解释为什么需要
@Transactional
:
查看
CrudMethodMetadataPostProcessor.postProcess
方法时,实现
集中包含的所有方法都将通过事务同步管理器调用。Custum函数需要手动添加事务。将该逻辑放在服务方法中,用@Transactional
注释该方法。这是业务逻辑,属于服务层而不是web层。您是否配置了EntityManager
?正如@M.Deinum所说,您必须将逻辑放入服务类中,并用{@transactional}@M.Deinum对其进行注释,很抱歉没有尽快回复您的评论,但是谢谢你给我一个解决方案的提示。我将注释放置到该方法中。我知道,我没有一个或多个服务,但这个后端是我学校项目的一部分。我是使用SpringBoot制作后端程序的初学者,我还没有时间阅读有关服务的内容,因为我希望它能让代码更简单。但是为了自我教育,我接受了您的建议,将来将所有业务逻辑都放在服务中。非常感谢您的帮助。您真的应该有一个服务层/外观。你不知道;I don’我不希望您的web层成为事务边界。创建一个服务并在那里添加它会更好
@Transactional
public void deleteSupplier(@RequestParam(name = "suppid") int suppid) {
itemrepo.deleteAllBySuppid(suppid);
supprepo.delete(supprepo.findByid(suppid));
}