簡體   English   中英

當目標是組合鍵時,Hibernate不保存ManyToOne

[英]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.

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