Java 使用JpaRepository更新和删除数据库

Java 使用JpaRepository更新和删除数据库,java,spring,postgresql,jpa,spring-data-jpa,Java,Spring,Postgresql,Jpa,Spring Data Jpa,我有两个与许多关系相关的实体: User.java @Id @Column(name = "user_id", updatable = false, nullable = false, unique = true) @GeneratedValue(generator = "UUID") @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") private UUID id; @Column(na

我有两个与许多关系相关的实体:

User.java

@Id
@Column(name = "user_id", updatable = false, nullable = false, unique = true)
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;

@Column(name = "name")
private String name;

@Column(name = "product")
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinTable(name = "products_users",
        joinColumns = {@JoinColumn(name = "user_id")},
        inverseJoinColumns = {@JoinColumn(name = "product_id")})
private Set<Product> products;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd@HH:mm:ss")
@Column(name = "created_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date createdOn;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd@HH:mm:ss")
@Column(name = "modified_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date modifiedOn;

// construuctors, getter, setter
}
@Id
@Column(name = "product_id", updatable = false, nullable = false, unique = true)
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;

@Column(name = "name")
private String name;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd@HH:mm:ss")
@Column(name = "created_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date createdOn;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd@HH:mm:ss")
@Column(name = "modified_on")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Date modifiedOn;

//getters, setters, contructors
}
我想按用户UUID从数据库中删除数据。我是如何编写这样的查询的

@Transactional
    @Modifying
    @Query(value = "delete from users where user_id = ?1", nativeQuery = true)
    void deleteByUUID(UUID uuid);
但它会删除用户表中唯一的一行。我希望删除有关此用户及其产品的所有数据


而且我也不知道如何正确地执行用户及其产品的更新。

关于级联,您有所有正确的设置:

问题是您正在触发本机查询。这绕过了所有JPA配置和级联。即使使用不带本机的JPQL delete,也会忽略所有级联和JPA配置


在代码的某个地方,您需要使用
findOne
获取用户。然后使用
delete
方法。只有这样,层叠才会起作用。

您已经对层叠进行了所有正确的设置:

问题是您正在触发本机查询。这绕过了所有JPA配置和级联。即使使用不带本机的JPQL delete,也会忽略所有级联和JPA配置


在代码的某个地方,您需要使用
findOne
获取用户。然后使用
delete
方法。只有这样,级联才能起作用。

基于Maciej Kowalski的回答

要在存储库上按UUID查找,请执行以下操作:

  Optional<User> findByUUID(UUID uuid);
可选的findByUUID(UUID-UUID);
关于要删除的服务:

Optional<User> optionalUser = repository.findByUUID(uuid);
        if (optionalUser.isPresent()) {
            User user = optionalUser.get();
            repository.delete(user);
        }
        // here on else you can throw an Exception
可选选项user=repository.findByUUID(uuid);
if(optionalUser.isPresent()){
User=optionalUser.get();
删除(用户);
}
//在这里,你可以抛出一个异常
关于要更新的服务:

Optional<User> optionalUser = repository.findByUUID(uuid);
        if (optionalUser.isPresent()) {
            User user = optionalUser.get();
            // Make changes here for example user.setName(otherName)
            repository.save(user);
        }
        // here on else you can throw an Exception
可选选项user=repository.findByUUID(uuid);
if(optionalUser.isPresent()){
User=optionalUser.get();
//在此处进行更改,例如user.setName(otherName)
保存(用户);
}
//在这里,你可以抛出一个异常

基于Maciej Kowalski的回答

要在存储库上按UUID查找,请执行以下操作:

  Optional<User> findByUUID(UUID uuid);
可选的findByUUID(UUID-UUID);
关于要删除的服务:

Optional<User> optionalUser = repository.findByUUID(uuid);
        if (optionalUser.isPresent()) {
            User user = optionalUser.get();
            repository.delete(user);
        }
        // here on else you can throw an Exception
可选选项user=repository.findByUUID(uuid);
if(optionalUser.isPresent()){
User=optionalUser.get();
删除(用户);
}
//在这里,你可以抛出一个异常
关于要更新的服务:

Optional<User> optionalUser = repository.findByUUID(uuid);
        if (optionalUser.isPresent()) {
            User user = optionalUser.get();
            // Make changes here for example user.setName(otherName)
            repository.save(user);
        }
        // here on else you can throw an Exception
可选选项user=repository.findByUUID(uuid);
if(optionalUser.isPresent()){
User=optionalUser.get();
//在此处进行更改,例如user.setName(otherName)
保存(用户);
}
//在这里,你可以抛出一个异常

您如何在模型计算中定义手动对多关系…@IstiaqueHossain,我编辑了问题中的代码可能与您在模型计算中定义手动对多关系的代码重复…@IstiaqueHossain,我编辑了问题中的代码可能重复,谢谢。你不知道如何更新这个实体吗?同样的事情。。您使用findXXX,然后只需更新java objectsIt works即可,谢谢。你不知道如何更新这个实体吗?同样的事情。。您可以使用findXXX,然后简单地更新java对象