Hibernate 生成的查询 - 不存在的表

Posted

技术标签:

【中文标题】Hibernate 生成的查询 - 不存在的表【英文标题】:Hibernate Generated query - Non existent table 【发布时间】:2014-09-24 22:21:26 【问题描述】:

我与实体创建了@OneToMany 关系。 例如,MemberAddress。这两个由Mem_Addr 表连接。

当我部署应用程序时,日志显示:

 EntityBinder  I org.hibernate.cfg.annotations.EntityBinder bindTable Bind entity Address on table ADDRESS

但该表在数据库中不存在。不知道这是怎么发生的?!?!

其次,Hibernate 查询(来自 Log)来拉取成员,预计也会显示 Address Query。但查询不包含 Address / Mem_addr 表。尽管有 @OneToMany 注释,但它只是单独拉成员,忽略地址。

有什么想法吗? Hibernate 是否智能地识别出不存在的表并且不在查询中包含该表?

编辑为清晰起见已更新。

【问题讨论】:

【参考方案1】:

我有一段时间没有使用 Hibernate,但我记得你必须确切地告诉 Hibernate 你希望它如何操作。换句话说,在您的注释中,您需要准确指定您希望如何加载记录。您可能需要阅读 OneToMany 注释。

您将需要:

@Entity
public class Member 
    private Set<Address> addresses = new HashSet<Address>();

    @Id
    ...

    @OneToMany
    @JoinTable(
            name="MEM_ADDR",
            joinColumns = @JoinColumn( name="MEMBER_ID"),
            inverseJoinColumns = @JoinColumn( name="ADDRESS_ID")
    )
    public Set<Part> getAddresses()  return addresses; 
    ...


@Entity
public class Address 
    ...

编辑:解决急切与延迟加载

仅供参考,您可以在 @OneToMany 注释中强制预先加载,因为默认值为 Lazy

@OneToMany(fetch=FetchType.EAGER)

希望对您有所帮助。

【讨论】:

所以首先听起来你还没有创建 Mem_Addr 表,这是你需要做的。 Hibernate 不会为您创建表,它只是从数据库中读取/写入数据。创建表后,您需要告诉 Hibernate 如何通过添加 @JoinTable 注释来进行 OneToMany 映射。以下帖子应该会有所帮助:***.com/questions/13047483/… 但我的另一个问题是地址没有主要的。主键在 Mem_addr 表中。所以成员(id PK)-->Mem_Addr(a_id pk)-->地址(a_id Fk)。如何在此处创建映射? 每个实体表(不是连接表)都应该有一个主键......尤其是如果您要在连接表中使用它。毕竟,这实际上就是一个连接表,两个不同实体的两个主键之间的关联。我建议将 PK 添加到地址。 我希望我能改变它。但我只需要处理它:-(。有什么解决方法吗?这是detailed question【参考方案2】:

好的。这是我想出来的。虽然在 deploymnet 期间,它说实体绑定到表,我猜它没有。

但由于依赖项是延迟加载的,因此只有在使用/请求依赖项时才会生成带有其依赖项的查询。那就是它抛出表不存在的错误。

我认为它会在绑定时间本身引发错误。但至少在我的情况下不是。

【讨论】:

以上是关于Hibernate 生成的查询 - 不存在的表的主要内容,如果未能解决你的问题,请参考以下文章

休眠表不存在错误

BIGQUERY:连接谓词中的表不受支持的子查询

hibernate删除表的方法

mysql提示table不存在:把数据库里的表都删了,用sql重新建表,怎么还提示表不存在呢?是在服务器上

Java Spring 表不存在

如果表不存在执行长查询