非常簡單的情況,JPA 正在殺死我的腦細胞
@Entity
@Table(name = "food_entry")
@ublic class FoodEntry implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "product_name", nullable = false, unique = false, insertable = true, updatable = false, length = 256)
private String name;
@CreatedDate
@Column(name = "instant", updatable = false, unique = false, nullable = false, insertable = true)
private Instant instant = Instant.now();
@Min(value = 0, message = "calories must be positive")
@Column(name = "calories", updatable = false, insertable = true, nullable = false, unique = false)
private long calories;
}
@Transactional
public FoodEntry update(final FoodEntry newEntry, long id) {
final User loggedUser = SecurityUtils.getCurrentLoggedUser();
if (loggedUser == null || !loggedUser.getAuthorities().contains(Authority.ADMIN))
throw new AccessDeniedException("You dont have authorization to perform this action");
FoodEntry current = this.repository.findById(id).orElseThrow(() -> new NotFoundException("Not found FoodEntry with specified id: " id));
current.setCalories(newEntry.getCalories());
current.setInstant(newEntry.getInstant());
current.setName(newEntry.getName());
try {
this.repository.save(current);
this.repository.flush();
return null;
}
catch (Exception e) {
throw e;
}
}
@Repository
public interface FoodRepository extends JpaRepository<FoodEntry, Long> {}
代碼運行,從資料庫中查詢食物條目,但是當我呼叫 save NOTHING HAPPENS 時,JPA 簡單回傳我作為引數傳遞的相同物件,并且沒有在資料庫上運行查詢......稍后到達該物體將回傳過時的價值
為什么?這太簡單了我錯過了什么?
CREATE 的相同代碼作業正常......但是當我嘗試更新時,save 方法什么也不做
uj5u.com熱心網友回復:
應該更改 updatable = false 屬性,JPA 不會更新屬性可更新為 false 的物體,因此將其設定為 true。
更多參考: https ://www.ibm.com/support/pages/jpa-entities-primary-key-automatically-generated-read-only-annotations
uj5u.com熱心網友回復:
我找到了答案,如果有人遇到同樣的問題,我會在這里發布一些超級愚蠢的東西:
https://github.com/spring-projects/spring-data-jpa/issues/1735
如果所有欄位都設定為更新 false,JPA 不會更新物體,它不會拋出錯誤或例外或任何型別的可跟蹤日志,它只是忽略呼叫
由于該專案早期要求不進行編輯,因此我忘記在更改后更改物體
uj5u.com熱心網友回復:
問題是,您要更新的所有這些屬性(卡路里、即時、名稱)都設定了它們的updatable=false.
屬性updatable=false只能設定到您第一次呼叫.save(..)。之后,所有這些屬性將不再更新,即使事務尚未重繪 。
uj5u.com熱心網友回復:
這個問題是由于 updatable=false 造成的,因為每當列被指定為 updatable=false 時,它??就不能通過 JPA 更新。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420544.html
標籤:
上一篇:StackOverflowErrorSpringbootOneToMany雙向映射
下一篇:持有使用JPA構建的表
