【问题标题】:JPA Hibernate MapsId for grand child孙子的 JPA Hibernate MapsId
【发布时间】:2014-10-20 18:10:52
【问题描述】:

我正在尝试在 JPA 2.1 中保存一个实体。 我有三个表 - MVCollection、MVCollectionVersion(这是 MVCollection 的版本)和 MVBelongsCollection(这是属于某个版本的项目)。 MVCollection 的主键是生成的序列号。 当我使用一个版本(没有任何项目)生成一个集合时,我正在使用@MapsId,并且生成的 ID 在子级中使用。但是,我似乎无法理解如何将其复制到这些项目中。

这里是到目前为止代码中的 sn-ps:

@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;

最后是MVBelongsCollectionId

@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;

如果我尝试使用 version 和 belongsCollection 项创建集合,则创建失败,因为它指出 mvCollectionId 字段为 null "ORA-01400: 无法将 NULL 插入 ("VMD"."MVBELONGSCOLLECTION"."MVCOLLECTIONID")" 因此,我尝试像使用 MVCollectionVersion 一样添加 @MapsId。

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;

但是在 Eclipse 中,这会在 @ManyToOne 注释上显示错误

The type of the ID mapped by the relationship 'mvCollectionVersion' does not agree with the primary key class of the target entity.

如果我开始这个过程,我会得到 原因:org.hibernate.MappingException:实体映射中的重复列:MVBelongsCollection 列:MVCVSNID(应使用 insert="false" update="false" 进行映射)

我尝试将 insertable = false 和 updatable = false 添加到我的@JoinColumn、@AttributeOVerride 和基础 ID 类,但仍然得到相同的错误。 这仅在存在 @MapsId 时发生。

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

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

【问题讨论】:

    标签: spring hibernate jpa


    【解决方案1】:

    我发现我的方式错误...

    我需要始终使用相同的 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;
    
       ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多