JPA / eclipse-link 2.6.0 / mysql:生成的表名不正确

时间:2015-08-07 16:18:04

标签: java mysql jpa eclipselink

我创建了两个表:

@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 来自何处?我该如何解决这个问题?

1 个答案:

答案 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