我在測試中做了幾個觀察,我發現它們很難理解。我的測試對一個實體進行了一些基本的更新(或合併)操作,該實體的屬性設置爲updatable = false。JPA可更新屬性和JPQL
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(generator = "some-generator")
@Column(name = "EMP_ID", nullable = false)
private Long id;
@Column(name = "EMP_NAME", updatable = false)
private String name;
@Version
@Column(name = "OBJECT_VERSION")
private int version;
public Employee() {
}
public Employee(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
注 - 我使用Hibernate作爲我的持久性提供程序。
我的意見和疑慮是
上述員工實體的name屬性更新=「假」集。如果我加載並設置一個僱員實體的名稱屬性,然後調用entityManager.merge(employee),合併不會執行任何更新查詢,這是預期的行爲,但它也不會拋出任何異常。是否可以配置JPA,以便引發運行時異常?
而不是調用entityManager.merge(employee),如果使用JPQL查詢更新name屬性,則查詢將成功執行並更新name屬性。 JPQL查詢行爲背後的技術推理與JPA對象更新有何不同,爲什麼?
如果使用JPQL查詢執行更新,儘管使用@Version註釋,版本號仍不會增加。我明白,這種行爲可以通過在更新查詢中添加「versioned」關鍵字來實現,但我希望瞭解在執行JPQL查詢時版本屬性背後的技術推理不會被更新。
由於JPQL是一種面向對象的查詢語言(如HQL是),我覺得不應該有對點2和3的技術實現問題這將是偉大聽到一些這方面的專家意見。謝謝。
我面對有關合並了同樣的問題。我沒有找到這個問題,所以我有另一個開放[問題](http://stackoverflow.com/questions/15108064/unexpected-behaviour-of-entitymanager-merge)。我發現的主要問題是合併返回一個對象,它永遠不會持久,也永遠不會持久。我正在爲此提出一個錯誤。 -Atul –