hibernate добавляет префикс к имени таблицы и, следовательно, не может его найти - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть пользовательский объект, следующий код содержит важные вещи для проблемы, с которой я сталкиваюсь (поэтому я опускаю вещи)

@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, это работает. Так почему же Hibernate ведет себя таким образом?

Спасибо за помощь!

// редактировать

Теперь я понял, что вставка также ищет таблицу databasename.user_user_group_invite , однако, когда я удаляю fetch = FetchType.EAGER , она начинает работать, почему это происходит? Я добавил fetch = FetchType.EAGER, теперь я еще больше запутался

1 Ответ

0 голосов
/ 03 сентября 2018

first , javax.persistence должно быть правильным, не изменяйте это.

секунда , попробуйте удалить аннотацию @Table над определением класса. если я не ошибаюсь, hibernate сгенерирует БД самостоятельно, и без жестко закодированных имен таблиц системе будет проще найти все, где она ее оставила.

если все вышеперечисленное не работает, попробуйте сохранить эти изменения, но теперь перенаправьте спящий режим в новый файл БД. Я столкнулся с некоторыми проблемами при попытке изменить существующую БД. если вы используете spring, определите источник данных с новым адресом, указывающим на новый файл, что позволит hibernate создать БД с нуля, используя то, что я предложил выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...