我对在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置于多方面?
答案 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
,因此即使在您的实体存续之前,您也有可能错过设置适当的主键。