Сессии Dropwizard при запуске программы

1

Я пытаюсь сохранить время, в которое запускается приложение dropwizard.

public class Main Application extends Application<MainConfiguration> {
private final HibernateBundle<DeployerConfiguration> hibernate = new       HibernateBundle<AppConfiguration>(App.class) {

public DataSourceFactory getDataSourceFactory(
        AppConfiguration configuration) {
    return configuration.getDataSourceFactory();
}


    @Override
    public void initialize(Bootstrap<AppConfiguration> bootstrap) {
    bootstrap.addBundle(hibernate);

public static void main() {
   final AppDAO ddao = new AppDAO(hibernate.getSessionFactory());
   App app = new App(new Date());
  adao.create(app);

Объект:

JsonIgnoreProperties(ignoreUnknown = true)
@Entity
@Table(name = "app")

@NamedQuery(name = "App.findAll", query = "SELECT d FROM App d")

public class App implements  Serializable{

  private static final long serialVersionUID = 1L;
  AppDAO adao;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  long id;


@JsonProperty
Date started;


public App ( Date started) {
    this.started = started;

}

Объект DAO

 public class AppDAO extends  AbstractDAO<Appr>  {
 public SessionFactory sessionFactory;

 public AppDAO(SessionFactory sessionFactory) {
    super(sessionFactory);
 }

public Session session;
public App create(App app) {
  return persist(app);

}

Когда я пытаюсь сохранить этот объект в методе main(), он жалуется, что нет сеанса, связанного с объектом. После отладки он дает объект DAO как null, который является истинным, потому что пока еще не создан сеанс пользователя. В этом случае, как я сохраняю объект? Что мне не хватает

Теги:
hibernate
session
dao
dropwizard

2 ответа

5

Dropwizard управляет сеансом автоматически, только если вы используете DAO в методе ресурсов, аннотированный как @UnitOfWork

Документация здесь

Если вы хотите использовать DAO за пределами этой области, вам нужно создать и управлять сеансом вручную, что довольно просто:

Session session = hibernate.getSessionFactory().openSession();
ManagedSessionContext.bind(session);
//do your stuff....
session.close();
  • 0
    Привет Джеймс, я пытался это сделать, но sessionFactory в этом случае пуст. Чтобы создать его, мне нужно создать конфигурационный файл hibernate и файл сопоставления, который кажется чрезмерным для того, что я пытаюсь достичь.
  • 0
    Да, у меня был похожий случай, и мне удалось получить фабрику сеанса без какой-либо специфической для hibernate конфигурации, только путем настройки свойств подключения, таких как здесь dropwizard.github.io/dropwizard/manual/jdbi.html#configuration, и использования сопоставлений аннотаций для объекта.
0

Чтобы добавить к предыдущему ответу. Я не смог просто получить его и работать только с привязкой. Код также должен быть завернут в транзакцию, чтобы работа настойчивости работала. (Исправьте меня, если я ошибаюсь здесь)

Вот фрагмент рабочего кода.

  public User run() {
    Transaction transaction = null;
    try (Session session = sessionFactory.openSession()) {
      ManagedSessionContext.bind(session);
      transaction = session.beginTransaction();

      // This interacts with the DAO object
      final User user = userDao.findAgentSmith();

      commitTransaction(transaction);
      return user;
    } catch (Exception e) {
      rollbackTransaction(transaction);
      log.error("Unable to create admin user", e);
      throw new RuntimeException(e);
    } finally {
      ManagedSessionContext.unbind(sessionFactory);
    }
  }

  private void commitTransaction(Transaction txn) {
    if (txn != null && txn.getStatus().canRollback()) {
      txn.commit();
    }
  }

  private void rollbackTransaction(Transaction txn) {
    if (txn != null && txn.getStatus().canRollback()) {
      txn.rollback();
    }
  }

Без транзакции функция возвращается успешно, но она не взаимодействует с уровнем сохранения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню