"缺少字段映射..."处于OneToMany双向关系

时间:2014-05-13 01:21:15

标签: jpa

我对在JPA中应该实现OneToMany双向关系的方式感到困惑。我搜索的越多,我就越来越反对。

我正在处理有用户的情况(西班牙语中的“Usuario”),并且这些用户有记录(西班牙语中的“Registro”)。因此,用户拥有许多记录,但记录中只有一个用户。

所以这是我的代码,首先是用户类:

@Entity
@NamedQueries(@NamedQuery(name="Usuario.findAll", query="select o from Usuario o"))
public class Usuario implements Serializable
{
    ...

    @Id
    private String login;

    @OneToMany(mappedBy = "usuario", cascade = CascadeType.PERSIST)
    private List<Registro>avances;

    ...
}

和记录类:

@Entity
@NamedQueries(@NamedQuery(name="Registro.findAll", query="select o from Registro o"))
public class Registro implements  Serializable
{
    ...

    @ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "usuario_login", referencedColumnName = "login")
    private Usuario usuario;

    ...
}

但是当我尝试向用户添加记录时,我得到了一个长堆栈跟踪:

Exception [TOPLINK-45] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DescriptorException
Exception Description: Missing mapping for field [USUARIO.login].
Descriptor: RelationalDescriptor(com.teleconsulta.entities.Usuario --> [DatabaseTable(USUARIO)])
    at oracle.toplink.essentials.exceptions.DescriptorException.missingMappingForField(DescriptorException.java:901)
    at oracle.toplink.essentials.internal.descriptors.ObjectBuilder.extractValueFromObjectForField(ObjectBuilder.java:1635)
    ...

我已经阅读了不同的意见,说MappedBy应该在很多方面(记录)和其他人说它应该在ONE(用户)。这是问题的原因吗?如何将MappedBy置于多方面?

2 个答案:

答案 0 :(得分:1)

我有同样的错误,在我的情况下,这是一个区分大小写的问题。

错: ...,referencedColumnName =“id”)

正确: ...,referencedColumnName =“ID”)

答案 1 :(得分:0)

对我来说,你的实体设置看起来很好。 mappedBy属性始终属于ONE - 侧,因为它引用了必须位于MANY侧的对方外键属性名称。

此错误听起来更像是您的实体 - 数据库映射未正确设置。你确定你的表中有db列就像你的实体一样吗?物业名称?更准确的说,如果您没有为您的实体定义任何列名(通过@Column)&#39;属性,JPA(TOP-LINK)将隐式尝试将这些属性映射到具有完全相同名称的表列!所以在你的情况下, 是否有一个名为&#39; login&#39;在您的表格&#39; USUARIO&#39;?

此外,由于您不使用任何ID-Generation Strategy,因此即使在您的实体存续之前,您也有可能错过设置适当的主键。