Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找不到逻辑名称为@embeddedid的列_Java_Spring_Hibernate_Spring Mvc_Jpa - Fatal编程技术网

Java 找不到逻辑名称为@embeddedid的列

Java 找不到逻辑名称为@embeddedid的列,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,在使用hibernate和JPA的SpringMVC应用程序中,我试图为其底层数据表具有两列主键的实体设置映射如何更改下面的代码以使其正常工作? 我创建了一个名为conceptPK的EmbeddedId,但收到以下错误消息: Caused by: org.hibernate.MappingException: Unable to find column with logical name: conceptPK in org.hibernate.mapping.Table(sct2_conce

在使用hibernate和JPA的SpringMVC应用程序中,我试图为其底层数据表具有两列主键的实体设置映射如何更改下面的代码以使其正常工作?

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

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
在entity类中,我使用以下代码设置主键:

@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;}
}
为了便于阅读,我将完整的代码和完整的堆栈跟踪上传到一个文件共享站点,而不是在这里创建一个过长的帖子

您可以在文件共享站点上阅读上述类的完整代码

您可以阅读引用第一个类的第二个类的代码

您可以阅读引用第一个类的第三个类的代码

您可以读取创建基础数据表的
SQL代码


您可以在文件共享站点读取完整的堆栈跟踪。

问题在于
SnomedDescription
实体的
@manytone
SnomedConcept
的关联

首先,这不是一个ManyToOne,而是一个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嵌入

如果是一对一的关系,那么
SnomedConcept
SnomedDescription
中的关联也应该是一对一的,与
@PrimaryKeyJoinColumn
关联


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

注释键,如下所示,为我解决了这个问题

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

ConceptPK
是一个内部类吗?@mabbas是。这有什么区别吗?我看不出你在做什么有什么错误,但你能创建一个单独的类并测试它是否解决了问题吗?@mabbas我创建了一个单独的类,但错误仍然存在。这个类由另外两个类引用,使用
conceptPK
。如果我也发布这些课程会有帮助吗?是的,因为我看不出你已经发布的代码有任何问题。+1并且感谢你花时间发布如此清晰的答案。有时,对于给定的
概念
,有多个
描述
,但对于给定的
描述
,总是只有一个
概念
。这是否改变了您关于
OneToOne
关系的建议?一个概念怎么可能有多个描述?作为描述主键的
DescriptionPK
,只有两个字段,
id
effectiveTime
。这些字段是否与
概念PK中的字段不同?只是看看你的SQL,它非常混乱。从
sct2\u description
sct2\u concept
的外键只提到
id
。有效时间怎么样?这些表是否仅由
id
链接?在这种情况下,描述指的是什么概念?如何描述?除了有效时间之外,还有其他变量,可以为给定概念的描述提供它们自己的值。感谢您指出另一个可能的关键问题。这是一个第三方数据库,我还在研究它。当我弄清楚如何对其进行某些更改时,我将类似更改传播到应用程序的其他部分可能会有延迟。但根据您的SQL,描述的主键仅由id和有效时间组成。对于同一id和effectiveTime组合,您将无法拥有多个记录,否则将违反约束。您是否尝试过使用已创建的表手动创建示例数据库记录?请查看您发布的SQL。
sct2\u概念
sct2\u描述
都有相同的主键定义:
primary key('id','effectiveTime')
。一个概念怎么可能有多个描述?