Таблицы отображений в спящем режиме с аннотациями - PullRequest
3 голосов
/ 22 мая 2011

Я только начинаю работать со Spring / Hibernate и пытаюсь понять, как Hibernate отображает сущности в таблицы. Прямо сейчас я работаю со следующими классами, чтобы проверить работу CRUD в hibernate:

@Entity
@Table(name = "Users")
public class UserEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String firstName;
    private String lastName;
    private int age;

    //Getters, setters, etc.
}


@Repository
public class UserDAOImpl implements UserDAO {
    @Autowired
    HibernateTemplate hibernateTemplate;

    @Override
    public UserEntity getUser(String firstName, String lastName) {
        List<UserEntity> users = hibernateTemplate.find("from UserEntity u where u.firstName = ? and u.lastName = ?", firstName, lastName);
        return (users.size() == 0 ? null : users.get(0));
    }

    @Override
    public void saveOrUpdate(UserEntity user) {
        hibernateTemplate.saveOrUpdate(user);
    }
}

Приведенный выше код работает нормально, но я запутался, как UserEntity сопоставляется с таблицей. Более конкретно, при звонке hibernateTemplate.find("from UserEntity u where u.firstName = ? and u.lastName = ?", firstName, lastName) я получаю в журнале следующее сообщение:

Hibernate: select userentity0_.id as id0_, userentity0_.age as age0_, userentity0_.firstName as firstName0_, userentity0_.lastName as lastName0_ from Users userentity0_ where userentity0_.firstName=? and userentity0_.lastName=?

При вызове hibernateTemplate.find() мне необходимо указать таблицу UserEntity , тогда как журнал сообщает, что он запрашивает таблицу Users (как я указал в аннотации @Table).

В идеале я хотел бы быть последовательным во всей моей программе и ссылаться на таблицу UserEntity как Users вместо UserEntity . Есть ли способ, которым я могу это сделать? Если это так, могу ли я сделать это с помощью HQL или мне нужно вместо этого писать собственные запросы SQL?

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Винсент объяснил этот вопрос, я просто добавлю некоторые пояснения.

Аннотация @Table является необязательной и просто указывает, что представляет собой базовая таблица (по умолчанию она совпадает с именем сущности)(проходя через механизм перевода).

Но идея hibernate (и слоев orm) состоит в том, чтобы позволить разработчику писать код без какой-либо ссылки на лежащую в основе реляционную модель. И это то, что вы должны попытаться сделать -«забыть» о реляционной модели и использовать только объектную модель.

1 голос
/ 22 мая 2011

Когда вы пишете HQL, вы запрашиваете модель OO. Так что в этом случае используется имя вашего класса UserEntity. Тем не менее, hibernate преобразует это в собственный SQL-запрос и, таким образом, в журналах вы увидите ссылки на таблицу пользователей. Я не уверен, что ваш вопрос, хотя. Если имя класса - UserEntity, то во всем приложении следует использовать UserEntity. Я думаю, что переход на нативный SQL необходим только тогда, когда HQL не делает то, что вы хотите.

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