簡體   English   中英

使用JpaRepository更新和刪除數據庫

[英]Updating and deleting from DB using JpaRepository

我有兩個與ManyToMany關系相關的實體:

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
}

產品.java

@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刪除,這仍將忽略所有級聯和JPA配置。

在代碼中的某個位置,您需要使用findOne來獲取用戶。 之后,使用delete方法。 只有這樣,級聯才能起作用。

基於Maciej Kowalski的答案

要在存儲庫中按UUID查找:

  Optional<User> 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

隨時更新:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM