无法与@EmbeddedId的逻辑名称查找列(unable to find column with

2019-10-20 01:31发布

在Spring MVC应用程序中使用Hibernate和JPA,我想建立一个映射,其基本数据表有两列主键的实体。 我怎样才能改变我下面的代码来得到它的工作?

我创建了一个名为的EmbeddedId conceptPK ,但我收到以下错误信息:

Caused by: org.hibernate.MappingException: 
Unable to find column with logical name: conceptPK 
in org.hibernate.mapping.Table(sct2_concept) and its related supertables and secondary tables

在实体类,我设置了用下面的代码中的主键:

@EmbeddedId
@AttributeOverrides({
    @AttributeOverride(name="id", column=@Column(name="id")),
    @AttributeOverride(name="effectiveTime", column=@Column(name="effectiveTime"))
})
private ConceptPK conceptPK;

嵌入式ConceptPK类如下:

@Embeddable
class ConceptPK implements Serializable {
    @Column(name="id", nullable=false)
    protected BigInteger id;

    @Column(name="effectiveTime", nullable=false)
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime effectiveTime;

    /** getters and setters **/
    public DateTime getEffectiveTime(){return effectiveTime;}
    public void setEffectiveTime(DateTime ad){effectiveTime=ad;}

    public void setId(BigInteger id) {this.id = id;}
    public BigInteger getId() {return id;}
}

为了便于阅读,我已经上传的完整代码和完整的堆栈跟踪到文件共享网站,而不是在这里创建过长的帖子。

你可以阅读完整的代码the class above在文件共享网站通过点击这个链接 。

你可以阅读代码, a second class引用一流的,在这个环节 。

你可以阅读代码, a third class引用一流的,在这个环节 。

你可以阅读SQL code创建基础数据表通过点击这个链接 。

你可以阅读的文件共享网站的完整的堆栈跟踪通过点击这个链接 。

Answer 1:

问题是SnomedDescription实体的@ManyToOne协会SnomedConcept

一开始,这不是一个多对一,但实际上一个OneToOne,因为它们的主键是相同的。

但主要的问题是,你已经在使用的列@JoinColumn注解这种关联并不存在数据库列,所以这不会有任何效果。

相反,你应该有连接列如下:

@ManyToOne
@JoinColumns({
    @JoinColumn(name="id", referencedColumnName="id"),
    @JoinColumn(name="effectiveTime", referencedColumnName="effectiveTime")
})
private SnomedConcept concept;

现在,你可以随身携带上使用@ManyToOne这种关系,但实际上你应该使用两个相同的嵌入式PK( ConceptPK ),然后SnomedDescription看起来更像是:

@Entity
@Table(name = "accesslogs")
public class SnomedDescription {

    @EmbeddedId
    private ConceptPK descriptionPK;

    @Column(name="active")
    private boolean active;

    @Column(name="moduleId")
    private BigInteger moduleid;

    @OneToOne
    @PrimaryKeyJoinColumn
    private SnomedConcept concept;

    ..... etc.

是的,你可以使用多个实体相同的PK嵌入。

如果它一比一的关系,那么在联想SnomedConceptSnomedDescription也应该是一个对一个,有@PrimaryKeyJoinColumn

如果两个之间的关联是可选的,那么“侧”是始终存在应该定义一到一个作为@OneToOne(optional=true) 。 换句话说,如果总有一个概念,但并不总是一个说明,则一对一个在概念应该被定义为@OneToOne(optional=true)



Answer 2:

注解如下hown解决这个问题对我来说是关键。

@Column(name = "name", nullable = false)
String name;


文章来源: unable to find column with logical name of @embeddedid