【发布时间】: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 和运行时错误。
如果有人能提供帮助,我将不胜感激。 提前致谢
【问题讨论】: