休眠将前缀添加到表名,因此找不到它

时间:2018-09-02 15:54:46

标签: java hibernate spring-boot jpa

我有用户实体,下面的代码包含一些重要的事情,这些都是我要解决的问题(因此我省略了一些东西)

@Entity
@Table(name="user")
public class User {
    private List<UserGroupInvite> invites;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    public List<UserGroupInvite> getInvites() { return invites; }
    public void setInvites(List<UserGroupInvite> invites) { this.invites = invites; }
}

和UserGroupInvite实体:

@Entity
@Table(name = "user_group_invite")
    public class UserGroupInvite implements Serializable {
        private User user;
        @Id
        @ManyToOne
        @JoinColumn(name="user_id") // in DB the row is called user_id
        @MapsId
        public User getUser() {
            return user;
        }

        public void setUser(User user) {
            this.user = user;
        }
    }

但是,当我从数据库中检索用户并调用:

user.getInvites().get(0).getSomePropertyOfInviteIhaveOmitted()

冬眠抱怨:

  

表'databasename.user_user_group_invite'不存在

为什么要查找 user_user_group_invite 而不是 databasename.user_group_invite

在我的hibernate-cfg.xml文件中,我已经定义

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <mapping class="com.project.model.User" />
    <mapping class="com.project.model.UserGroupInvite" />
  </session-factory>
</hibernate-configuration>

但是它正在寻找错误的名称。

但是,当我尝试插入到user_group_invite表中时,它会起作用。那么为什么冬眠会以这种方式表现呢?

感谢帮助!

//编辑

现在,我意识到插入操作还会查找表 databasename.user_user_group_invite ,但是,当我删除 fetch = FetchType.EAGER 时,它开始起作用,为什么会发生这种情况?我添加了fetch = FetchType.EAGER,现在我更加困惑了

1 个答案:

答案 0 :(得分:-1)

首先,javax.persistence应该是正确的导入-请勿更改。

second ,请尝试删除类定义上方的@Table批注。如果我没记错的话,hibernate会自行生成数据库,并且无需对表名进行硬编码,对于系统来说,找到保留它的所有内容可能会更简单。

如果以上所有方法均无效,请尝试保留这些更改,但现在将休眠重定向到新的DB文件。尝试更改现有数据库时遇到了一些问题。 如果您使用的是Spring,请使用上面指向我的建议,使用指向新文件的新地址定义“数据源”,从而让休眠模式从头开始创建数据库。