[英]Hibernate not saving ManyToOne when target is composite key
當該關聯的對象是組合鍵時,Hibernate似乎沒有更新FK引用。
事務成功(沒有錯誤,沒有堆棧跟蹤),但是沒有生成更新語句(我啟用了休眠日志記錄)。
我嘗試了所有方式的級聯批注(無級聯,ALL,PERSIST甚至SAVE_UPDATE),而症狀沒有任何變化。 在線OpenXava屏幕以及自定義Java代碼(在OpenXava操作中)都存在這種不更新的症狀。
應用程序數據庫要求允許外部上載到表,因此有人告訴我,他們不願意選擇切換到系統分配的鍵。
所屬關聯(當前沒有任何級聯設置):
@ManyToOne(fetch=FetchType.LAZY,optional=false)
@Required
@JoinColumns({
@JoinColumn(name="programID",referencedColumnName="programID",nullable=false,unique=false,insertable=false,updatable=false),
@JoinColumn(name="projectID",referencedColumnName="projectID",nullable=false,unique=false,insertable=false,updatable=false)
})
@DescriptionsList(descriptionProperties="parentProgram.programName,projectName")
@ReferenceView("reference")
private Project associatedProject;
逆關聯:
@OneToMany(mappedBy="associatedProject",fetch=FetchType.LAZY) //No cascade allowed
@ReadOnly
private Set<Asset> assets = new HashSet<Asset>();
有人知道這是否有一個開放的Hibernate錯誤嗎? 我無法使用Google搜索找到任何內容,但也許有人有第一手經驗。
謝謝,羅伊。
編輯:作為一種變通辦法,我試圖編寫自己的HQL更新。
update Asset set associatedProject = :ap where assetKey = :key
在處理SET子句時unexpected AST node: AND
在鈍的Hibernate語法錯誤unexpected AST node: AND
上失敗了。
update Asset set associatedProject.projectId = :projId, associatedProject.parentProgram = :pgm where assetKey = :key
生成的update Asset cross join set projectID=?, programID=? where assetKey=?
update Asset cross join set projectID=?, programID=? where assetKey=?
然后在“ cross”處使用無效語法失敗
但是,執行我自己的SQL更新是可行的。
有誰有更好的解決方法? 或對根本問題有任何進一步的想法?
在我看來,這仍然指向具有復合鍵處理的Hibernate錯誤(當然,這是一個錯誤-您不能只跳過沒有任何錯誤或消息的更新)。
Hibernate不會保存該關系,因為您說它不會保存該關系。 只需從兩個@JoinColumn中刪除insertable = false,updatable = false即可。
這是您如何使用“派生身份”來映射主鍵的開始,這可能會有所幫助。 我只是在猜測您的模型。 但這是一個開始。
@Entity
public class Program {
@Id
int id;
@OneToMany(mappedBy="program")
Set<Project> projects;
...
}
@Embeddable
public class ProjectID {
int projectID;
int programID; // corresponds to the type of Program's primary key
...
}
@Entity
public class Project {
@EmbeddedId
ProjectID id;
@MapsId("programID") // maps 'programID' attribute of embedded ID
@ManyToOne
Program program;
@OneToMany(mappedBy="associatedProject", fetch=FetchType.LAZY)
Set<Asset> assets;
...
}
@Embeddable
public class AssetID {
int assetID;
ProjectID projectID; // corresponds to the type of Project's primary key
...
}
@Entity
public class Asset {
@EmbeddedId
AssetID id;
@MapsId("projectID") // maps 'projectID' attribute of embedded ID
@ManyToOne(fetch=FetchType.LAZY, optional=false)
Project associatedProject;
...
}
JPA 2.1規范的第2.4.1節中討論了派生身份。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.