我创建了两个表:
@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 来自何处?我该如何解决这个问题?
答案 0 :(得分:1)
我认为您必须在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的mappedBy元素 注释
mappedBy元素指定属性或字段 作为关系所有者的实体。多方面 多对一双向关系不得定义mappedBy 元件。许多方面始终是这种关系的拥有方。
我用实体Person和Address(1:N)进行了快速测试。首先,我省略了mappedBy
,并创建了一个名为Person_Address
的表。添加mappedBy
后,已创建表Address
。