繁体   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