Я пытаюсь сохранить время, в которое запускается приложение 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, который является истинным, потому что пока еще не создан сеанс пользователя. В этом случае, как я сохраняю объект? Что мне не хватает
Dropwizard управляет сеансом автоматически, только если вы используете DAO в методе ресурсов, аннотированный как @UnitOfWork
Если вы хотите использовать DAO за пределами этой области, вам нужно создать и управлять сеансом вручную, что довольно просто:
Session session = hibernate.getSessionFactory().openSession();
ManagedSessionContext.bind(session);
//do your stuff....
session.close();
Чтобы добавить к предыдущему ответу. Я не смог просто получить его и работать только с привязкой. Код также должен быть завернут в транзакцию, чтобы работа настойчивости работала. (Исправьте меня, если я ошибаюсь здесь)
Вот фрагмент рабочего кода.
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();
}
}
Без транзакции функция возвращается успешно, но она не взаимодействует с уровнем сохранения.