Hibernate 生成的查询 - 不存在的表
Posted
技术标签:
【中文标题】Hibernate 生成的查询 - 不存在的表【英文标题】:Hibernate Generated query - Non existent table 【发布时间】:2014-09-24 22:21:26 【问题描述】:我与实体创建了@OneToMany 关系。
例如,Member
和 Address
。这两个由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 生成的查询 - 不存在的表的主要内容,如果未能解决你的问题,请参考以下文章