Подтвердить что ты не робот

Hibernate (с аннотациями) - как начать

Я пытаюсь начать с hibernate, но я не могу найти какие-либо учебники, которые я понимаю. Я пытаюсь создать простое приложение для начала, но я действительно не знаю, с чего начать.

Я довольно продвинутый с java, хотя на самом деле используется только eclipse. Итак, где я могу настроить, какой DB он использует, и так?

[править]
Я знаком с понятиями ORM, и что такое Hibernate. То, что я не знаю или не понимаю, - это то, с чего начать мое приложение. Я намерен использовать аннотации, но, после аннотации моих POJO, что мне делать? Где указать сервер базы данных, пользователя и т.д.? Что еще мне нужно сделать?

4b9b3361

Ответ 1

Мои опыты и фон были похожи, и мне также было трудно найти учебник, в котором были рассмотрены мои предпочтения в области разработки (которые выглядят похожими на ваши):

  • Предпочитают аннотации JPA по XML, добавляя только аннотации Hibernate, когда JPA-копии не достаточны
  • Используйте Hibernate SessionFactory/Session для доступа к постоянным данным, а не к JPA EntityManager
  • Используйте, по возможности, неизменные классы

Я прочитал большую часть Java Persistence with Hibernate, и отделить этот вариант использования от всех остальных опций, которые он представляет, потребовалось много времени (Конфигурация XML в формате Hibernate/JPA, аннотации xdoclet и т.д.).

Это сделало бы для меня гораздо больше смысла, если бы доступная документация закрепилась и активно подталкивала меня в этом направлении, вместо того чтобы давать мне множество вариантов и задаваться вопросом, куда идти. Не имея этого, я изучил следующие уроки, переведя стандартную Hibernate Tutorial в аннотации.

Конфигурация

  • Храните файл hibernate.cfg.xml до минимума (см. ниже).
  • Определить имена столбцов/таблиц базы данных явно с помощью аннотаций JPA, чтобы получить точно схему, которую вы хотите. Вы можете дважды проверить его, используя SchemaExport.create(true, false). Обратите внимание, что вы не можете получить точную схему, которую вы ожидаете, если Hibernate пытается обновить схему в существующей базе данных (например, вы не можете добавить ограничение NOT NULL в столбец, который уже содержит нулевые значения).
  • Создайте конфигурацию SessionFactory с помощью AnnotationConfiguration.addAnnotatedClass(). addAnnotatedClass()...

Здесь моя копия hibernate.cfg.xml. Он только устанавливает свойства и явно избегает любой конфигурации отображения.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Information about the database to be used -->
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

        <!-- Misc. Hibernate configuration -->
        <property name="hbm2ddl.auto">update</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">false</property>
    </session-factory>
</hibernate-configuration>

Область

  • Начать/совершить/отменить транзакции за пределами каждого класса Manager/DAO. Я понятия не имею, почему учебник EventManager запускает/совершает собственные транзакции, так как книга идентифицирует это как анти-шаблон. Для сервлета в учебнике это можно сделать, создав фильтр, который запускает транзакцию, вызывает остальную часть FilterChain и затем совершает/откатывает транзакцию.
  • Аналогично, запустите SessionFactory и передайте его каждому классу Manager/DAO, который затем вызывает SessionFactory.getCurrentSession() в любое время, когда ему необходимо получить доступ к данным. Когда придет время unit test ваших классов DAO, создайте свой собственный SessionFactory, который подключается к базе данных в памяти (например, "jdbc: hsqldb: mem: test" ) и передает ее в тестируемый DAO.

Например, некоторые фрагменты из моей версии EventManager:

public final class EventManager {

private final SessionFactory sessionFactory;

/** Default constructor for use with JSPs */
public EventManager() {

    this.sessionFactory = HibernateUtil.getSessionFactory();
}

/** @param Nonnull access to sessions with the data store */
public EventManager(SessionFactory sessionFactory) {

    this.sessionFactory = sessionFactory;
}

    /** @return Nonnull events; empty if none exist */
public List<Event> getEvents() {

    final Session db = this.sessionFactory.getCurrentSession();
    return db.createCriteria(Event.class).list();
}

/**
 * Creates and stores an Event for which no people are yet registered.
 * @param title Nonnull; see {@link Event}
 * @param date Nonnull; see {@link Event}
 * @return Nonnull event that was created
 */
public Event createEvent(String title, Date date) {

    final Event event = new Event(title, date, new HashSet<Person> ());
    this.sessionFactory.getCurrentSession().save(event);
    return event;
}

/**
 * Registers the specified person for the specified event.
 * @param personId ID of an existing person
 * @param eventId ID of an existing event
 */
public void register(long personId, long eventId) {

    final Session db = this.sessionFactory.getCurrentSession();
    final Person person = (Person) db.load(Person.class, personId);
    final Event event = (Event) db.load(Event.class, eventId);
    person.addEvent(event);
    event.register(person);
}

...other query / update methods...
}

Классы данных

  • Поля являются частными
  • Методы Getter возвращают защищенные копии, так как Hibernate может напрямую обращаться к полям
  • Не добавляйте методы настройки, если вам действительно не нужно.
  • Когда необходимо обновить какое-либо поле в классе, сделайте это так, чтобы сохранить инкапсуляцию. Гораздо безопаснее называть что-то вроде event.addPerson(person) вместо event.getPeople(). Add (person)

Например, я нахожу, что эту реализацию события намного проще понять, если вы помните, что Hibernate обращается к полям непосредственно, когда это необходимо.

@Entity(name="EVENT")
public final class Event {

    private @Id @GeneratedValue @Column(name="EVENT_ID") Long id; //Nullable

    /* Business key properties (assumed to always be present) */
    private @Column(name="TITLE", nullable=false) String title;

    @Column(name="DATE", nullable=false) 
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    /* Relationships to other objects */
    @ManyToMany
    @JoinTable(
        name = "EVENT_PERSON",
        joinColumns = {@JoinColumn(name="EVENT_ID_FK", nullable=false)},
        inverseJoinColumns = {@JoinColumn(name="PERSON_ID_FK", nullable=false)})
    private Set<Person> registrants; //Nonnull

    public Event() { /* Required for framework use */ }

    /**
     * @param title Non-empty name of the event
     * @param date Nonnull date at which the event takes place
     * @param participants Nonnull people participating in this event
     */
    public Event(String title, Date date, Set<Person> participants) {

        this.title = title;
        this.date = new Date(date.getTime());
        this.registrants = new HashSet<Person> (participants);
    }

    /* Query methods */

    /** @return Nullable ID used for persistence */
    public Long getId() {

        return this.id;
    }

    public String getTitle() {

        return this.title;
    }

    public Date getDate() {

        return new Date(this.date.getTime());
    }

    /** @return Nonnull people registered for this event, if any. */
    public Set<Person> getRegistrants() {

        return new HashSet<Person> (this.registrants);
    }

    /* Update methods */

    public void register(Person person) {

        this.registrants.add(person);
    }
}

Надеюсь, что это поможет!

Ответ 3

Я просто разместил ссылку для вас, потому что у меня тоже такая же проблема это хорошая ссылка для вас, которая использует Eclipse Спящий инструмент для Eclipse

какая-то полезная ссылка:

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e2911
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
http://boris.kirzner.info/blog/archives/2008/07/19/hibernate-annotations-the-many-to-many-association-with-composite-key/
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/

но вы должны заметить что-то 1- создать свой объект (класс java) 2- создать Дао для каждого объекта 3- Создать QueryManager и HibernateUtil (получить SessionFactory) 4- и сделайте свои репозиции (фасадный слой)

Ответ 4

Посмотрите на этот учебник, в котором объясняются аннотации Hibernate с ясными примерами. Проверьте это http://www.youtube.com/user/patrickwashingtondc Вам не нужен сервер приложений, чтобы запускать примеры Hibernate.