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