我创建了两个表:
@Entity
@Table(name="instanceOfClass")
public class InstanceOfClass {
(...)
@OneToMany(fetch=FetchType.LAZY)
public List<InstanceOfDataProperty> getDataProperties() {
return dataProperties;
}
(...)
}
和
@Entity
@Table(name="instanceOfDataProperty")
public class InstanceOfDataProperty {
(...)
@ManyToOne(optional=false,fetch=FetchType.LAZY)
@JoinColumn(referencedColumnName="instance_id", nullable=false, updatable=false)
public InstanceOfClass getInstance()
{
return this.instance;
}
(...)
}
调用getDataProperties()时,在日志中出现以下错误
Call: SELECT t1.id, t1.smallContent, t1.VALUE, t1.INSTANCE_id,t1.prop_id, t1.LARGECONTENT_id FROM instanceOfClass_instanceOfDataProperty t0, instanceOfDataProperty t1 WHERE ((t0.InstanceOfClass_id = ?) AND (t1.id = t0.dataProperties_id)) bind => [1 parameter bound]
Query: ReadAllQuery(name="file:/path/to/WEB-INF/classes/_jdbc/mydao" referenceClass=InstanceOfDataProperty sql="SELECT t1.id, t1.smallContent, t1.VALUE, t1.INSTANCE_id, t1.prop_id, t1.LARGECONTENT_id FROM instanceOfClass_instanceOfDataProperty t0, instanceOfDataProperty t1 WHERE ((t0.InstanceOfClass_id = ?) AND (t1.id = t0.dataProperties_id))")
(....)
引起原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'user_me.instanceOfClass_instanceOfDataProperty'不存在
这个user_me.instanceOfClass_instanceOfDataProperty来自何处?我怎样才能解决这个问题 ?
最佳答案
我认为您必须在mappedBy
实体中的@OneToMany
注释中使用InstanceOfClass
值,如下所示:
@Entity
@Table(name="instanceOfClass")
public class InstanceOfClass {
(...)
@OneToMany(fetch=FetchType.LAZY, mappedBy="instanceOfClass")
public List<InstanceOfDataProperty> getDataProperties() {
return dataProperties;
}
(...)
}
其中
instanceOfClass
应该是InstanceOfDataProperty类中的getter的名称。在JavaEE7 pdf的37.1.5.1章中:
双向关系必须遵循这些规则。
双向关系的反面必须使用
@ OneToOne,@ OneToMany或@ManyToMany的mappingBy元素
注解。
mappingBy元素指定属性或字段
关系所有者。的多方面
多对一双向关系一定不能定义mappedBy
元件。关系的多方面始终是拥有关系的一方。
我使用实体Person and Address(1:N)进行了快速测试。首先,我省略了
mappedBy
,并创建了一个名为Person_Address
的表。添加mappedBy
后,已创建表Address
。