删除多对多Java中的实体

删除多对多Java中的实体,java,spring,spring-data-jpa,sql-delete,Java,Spring,Spring Data Jpa,Sql Delete,我在Spring Jpa中使用复合主键构建了多对多关联。我的实体为客户和枪型,桥梁实体为租赁。我的问题是,我想删除一个租赁(我想保持获取类型的急切性)。代码运行时没有异常,但没有结果 这些实体是: public class Client extends BaseEntity<Long> { private String name; @Embedded private Address address; @OneToMany(mappedBy = &

我在Spring Jpa中使用复合主键构建了多对多关联。我的实体为客户和枪型,桥梁实体为租赁。我的问题是,我想删除一个租赁(我想保持获取类型的急切性)。代码运行时没有异常,但没有结果

这些实体是:

public class Client extends BaseEntity<Long> {

    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "client",
            cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH},
            fetch = FetchType.EAGER)
    @ToString.Exclude
    private Set<Rental> rentalSet = new HashSet<>();
}
在服务中的delete方法中,我尝试从两个集合中删除租金,但仍然没有任何效果:

@Override
    @Transactional
    public void deleteRental(Long clientId, Long gunTypeId) {
        logger.trace("deleteRental - method entered; clientId = {}, gunTypeId={}", clientId, gunTypeId);
        Client client = clientRepository.findById(clientId).orElseThrow();
        Optional<Rental> rentalOptional = client
                .getRentalSet()
                .stream()
                .filter(rental -> rental.getGunType().getId().equals(gunTypeId))
                .findFirst();
        rentalOptional.ifPresent(
                rental -> {
                    client.getRentalSet().remove(rental);
                }
        );
        GunType gunType = gunTypeRepository.findById(gunTypeId).orElseThrow();
        rentalOptional = gunType
                .getRentalSet()
                .stream()
                .filter(rental -> rental.getClient().getId().equals(clientId))
                .findFirst();
        rentalOptional.ifPresent(
                rental -> {
                    gunType.getRentalSet().remove(rental);
                }
        );
        logger.trace("deleteRental - method finished");
    }
@覆盖
@交易的
公共租赁(长客户ID、长gunTypeId){
trace(“deleteRent-输入的方法;clientId={},gunTypeId={}”,clientId,gunTypeId);
Client Client=clientRepository.findById(clientId.orelsetrow();
可选rentalOptional=客户端
.getRentalSet()
.stream()
.filter(rental->rental.getGunType().getId().equals(gunTypeId))
.findFirst();
出租可选的(
租金->{
client.getRentalSet().remove(rental);
}
);
GunType GunType=gunTypeRepository.findById(gunTypeId.orElseThrow();
rentalOptional=枪型
.getRentalSet()
.stream()
.filter(出租->出租.getClient().getId().equals(clientId))
.findFirst();
出租可选的(
租金->{
gunType.getRentalSet().remove(出租);
}
);
logger.trace(“deleteRental-方法完成”);
}

我还尝试使用诸如ophanRemoval或CascadeType.ALL之类的注释,但这些注释并没有改变任何东西。或者甚至可以这样做吗?

您只需要删除租赁实体。(这表示要在联接表中删除的数据库表行)

使用delete方法创建存储库,如下所示:

@Repository
public interface RentalRepository extends CrudRepository {
    void deleteByClient_idAndGunType_id(Long clientId, Long gunTypeId);
}

有用文章:

我必须在没有存储库的情况下完成这项工作,这就是为什么这项工作非常困难的原因。您抵制从存储库中获取信息的原因是什么?这是大学的任务,我不知道为什么在这种情况下,我认为问题在于您正在用2个多对一映射对多关联进行建模。从JPA的角度来看,在这种情况下,不需要删除实体(如果不使用级联删除)。我认为您已经使用“经典”多个模型进行了建模(没有使用实体对联接表进行建模),那么您的方法(从两侧删除实体)就可以了。
@Override
    @Transactional
    public void deleteRental(Long clientId, Long gunTypeId) {
        logger.trace("deleteRental - method entered; clientId = {}, gunTypeId={}", clientId, gunTypeId);
        Client client = clientRepository.findById(clientId).orElseThrow();
        Optional<Rental> rentalOptional = client
                .getRentalSet()
                .stream()
                .filter(rental -> rental.getGunType().getId().equals(gunTypeId))
                .findFirst();
        rentalOptional.ifPresent(
                rental -> {
                    client.getRentalSet().remove(rental);
                }
        );
        GunType gunType = gunTypeRepository.findById(gunTypeId).orElseThrow();
        rentalOptional = gunType
                .getRentalSet()
                .stream()
                .filter(rental -> rental.getClient().getId().equals(clientId))
                .findFirst();
        rentalOptional.ifPresent(
                rental -> {
                    gunType.getRentalSet().remove(rental);
                }
        );
        logger.trace("deleteRental - method finished");
    }
@Repository
public interface RentalRepository extends CrudRepository {
    void deleteByClient_idAndGunType_id(Long clientId, Long gunTypeId);
}