当前位置: 首页 > 知识库问答 >
问题:

子级的JPA Hibernate MapsId

乔宏峻
2023-03-14

我试图在JPA2.1中保存一个实体。我有三个表--MVCollection、MVCollectionVersion(它是MVCollection的版本)和MVBelomsCollection(它是属于一个版本的项)。MVCollection的主键是生成的序列号。当我生成一个带有版本(不包含任何项)的集合时,我使用@mapsid,生成的ID在子级中使用。然而,我似乎不能理解我如何能复制这与项目。

@Entity
public class MVCollection {

    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
         generator = "MVCOLLECTION_SEQ")
    @SequenceGenerator(name = "MVCOLLECTION_SEQ", 
        sequenceName = "VMD.MVCOLLECTION_SEQ")
    @Id
    @Column(name = "MVCOLLECTIONID")
   private Long id;

MVCollectionVersion

@Entity
public class MVCollectionVersion {
    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID")) })

    private MVCollectionVersionId id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "MVCOLLECTIONID", referencedColumnName = "MVCOLLECTIONID"),
     })
    @MapsId("mvCollectionId")
    private MVCollection mvCollection;

    @OneToMany(fetch = FetchType.LAZY, mappedBy="mvCollectionVersion", cascade={CascadeType.MERGE, CascadeType.PERSIST})
   private List<MVBelongsCollection> mvCollectionItems; 

MVCollectionID

@Embeddable
public class MVCollectionVersionId implements java.io.Serializable {

/**
 * 
 */
    private static final long serialVersionUID = 2551937096790427792L;
    private Long mvCollectionId;
    private Integer versionId;

MVbelongsCollection

@Entity
public class MVCollectionItems

    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name = "managedViewId", column = @Column(name = "MANAGEDVIEWID")),
        @AttributeOverride(name = "mvCollectionId", column = @Column(name = "MVCOLLECTIONID")),
        @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID")) })

    private MVBelongsCollectionId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "MVCOLLECTIONID", referencedColumnName = "MVCOLLECTIONID"),
        @JoinColumn(name = "MVCVSNID", referencedColumnName = "MVCVSNID") })
    private MVCollectionVersion mvCollectionVersion;
@Embeddable
public class MVBelongsCollectionId implements Serializable{


/**
 * 
 */
    private static final long serialVersionUID = 1L;

    @Column ( name = "MANAGEDVIEWID", nullable = false, precision = 38)
    private Long managedViewId;

    @Column ( name = "MVCOLLECTIONID", nullable = false, precision = 38)
    private Long mvCollectionId;

    @Column ( name = "MVCVSNID", nullable = false, precision = 38)
    private Integer versionId;
public class MVBelongsCollection {

/**
 * primary key
 */
    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name = "managedViewId", column = @Column(name = "MANAGEDVIEWID")),
        //@AttributeOverride(name = "mvCollectionId", column = @Column(name = "MVCOLLECTIONID")),
        @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID")) })
    private MVBelongsCollectionId id;


/**
 * collection that this joins to.
 */
    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("mvCollectionId")
    @JoinColumns({
        @JoinColumn(name = "MVCOLLECTIONID", referencedColumnName = "MVCOLLECTIONID"),
        @JoinColumn(name = "MVCVSNID", referencedColumnName = "MVCVSNID") })
    private MVCollectionVersion mvCollectionVersion;
The type of the ID mapped by the relationship 'mvCollectionVersion' does not agree with the primary key class of the target entity.

我尝试将insertable=false和updatable=false添加到我的@JoinColumn、@AttributeOverride和基础ID类中,但仍然得到相同的错误。只有当@mapsid存在时才会发生这种情况。

我现在不知道如何让MVBelongsCollection使用生成的MVCollectionId,或者如何阻止eclipse和运行时错误。

如果有人能帮忙,我将不胜感激。提前致谢

共有1个答案

仲绍晖
2023-03-14

我发现了自己的错误...

我需要在整个过程中使用相同的embeddedId。因此,MVBelongsCollectionId需要更改以包括父类的嵌入id:

@Embeddable
public class MVBelongsCollectionId implements Serializable{


    /**
    * 
    */
    private static final long serialVersionUID = 1L;

    @Embedded
    @AttributeOverrides( {
        @AttributeOverride(name = "mvCollectionId", column = @Column(name = "MVCOLLECTIONID", nullable = false, precision = 38, scale = 0)),
        @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID", nullable = false, precision = 8, scale = 0)) 

    })
    MVCollectionVersionId collectionVersionId;

    @Column ( name = "MANAGEDVIEWID", nullable = false, precision = 38)
    private Long managedViewId;

   ....
 类似资料:
  • 问题内容: 使用Eclise JDT,我需要检索任何ASTNode的子代。我可以在某处使用实用程序方法吗? 我现在唯一想到的方法是子类化ASTVisitor并手动处理每种节点以找到其子节点。但是研究每种节点类型需要大量的工作。 问题答案: 我将从查看ASTView插件的源开始,因为那也做同样的事情。 根据中的代码 org.eclipse.jdt.astview.views.ASTViewConte

  • 问题是要确定子数据的总和是否等于父数据。如果是,返回真,否则返回假。 下面是我的代码,在提交时出现错误。我知道这是一个简单的问题,但在编写了条件之后,我很难通过遍历所有左右节点来递归检查二叉树中每个节点的和条件。 请指导我,因为我哪里做错了。

  • 假设我有一个应用程序来处理一系列的书。 我的应用程序允许向库中添加新书。创建书籍时,用户可以在列表中选择作者,如果作者尚不存在,则可以将其添加到列表中,并在表单字段中提供其姓名。填写表单后,数据将发送到WS,类似 然后我将json映射到我的实体中 书: 作者 这不会像用户尝试添加新作者一样工作,当我尝试. sav()时,我会收到错误: 组织。冬眠TransientPropertyValueExce

  • 问题内容: 在我的应用中,我必须经常在两种布局之间切换。错误在下面发布的布局中发生。 第一次调用布局时,没有发生任何错误,一切都很好。然后,当我调用不同的布局(空白),然后再次调用我的布局时,出现以下错误: 我的布局代码如下所示: 我知道之前曾有人问过这个问题,但对我来说没有帮助。 问题答案: 错误消息说明你应该做什么。

  • 我有以下xml文件结构: 我的目标是借助xslt文件生成html输出。在这样做的过程中,我想应用一个模板来指导根元素的子元素,该元素将标记的名称输出为标题1,其内容包含在 为了更容易理解我想要的是HTML输出的示例: 现在,我的尝试如下所示:http://pastebin.com/wKgSLbcE 但它不适用于

  • 我有以下html: 正如你所看到的那样。子列表div总是跟在带和一些文本的后面,就像div是h2的子列表一样(h2是子列表的标题)。另一个包含锚定标记。 我想得到div. sublist之前的所有h2标签。 这是我当前的xpath子句: 我最终得到了不同的元素(a、div、img),但h2元素。