【发布时间】:2015-02-03 23:41:11
【问题描述】:
我正在使用 Dropwizard Hibernate ( hibernate 4) 来持久化一些简单的实体。
我的实体有一些属性,例如“created_date”、“modified_date”和“deleted_date”。
我希望这些属性在保存/更新时间自动填充/更新。
而且我想在 ORM 级别而不是 DB 上拥有该逻辑。此外,另一方面,出于某些充分的原因,我们正在管理自己的会话。
现在的问题是dropwizard不支持hibernate 4的全部功能。它忽略了@PrePersist和@PreUpdate。
所以我决定编写自己的自定义SaveOrUpdateEventListener,并将其注册到 sessionFactry 的 EventListener Registry 中。然后我意识到 Dropwizard 确实提供了对 EventListener Registry 的访问。因此进入 dropwizard SessionFactoryFactory 类并对其进行修改以访问 EventListener 注册表。
然后使用以下代码我正在尝试注册我的事件侦听器:
SessionFactory sessionFactory = hibernate.getSessionFactory();
EventListenerRegistry listenerRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry().getService(EventListenerRegistry.class);
EventListenerGroup<SaveOrUpdateEventListener> evlg = listenerRegistry.getEventListenerGroup(EventType.SAVE_UPDATE);
evlg.appendListener(new SaveOrUpdateDateListener());
这是我的事件监听器:
public class SaveOrUpdateDateListener extends DefaultSaveOrUpdateEventListener{
private static final Logger logger = LoggerFactory.getLogger(SaveOrUpdateDateListener.class);
@Override
public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException{
logger.info("onSaveOrUpdate is being called");
if (event.getObject() instanceof LastModifiable) {
LastModifiable record = (LastModifiable) event.getObject();
record.setCreatedDate(Instant.now());
}
super.onSaveOrUpdate(event);
}
}
这是我的实体类:
@Entity
@EntityListeners(value = { SaveOrUpdateDateListener.class })
@Table (name = "portfolio")
public class PortfolioBusiness implements LastModifiable, Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private long id;
@Column(name = "org_id", nullable = false)
private long orgId;
@Column(name = "subscription_id", nullable = false)
private String subscriptionId;
@Column(name="duns", nullable = false)
private int duns;
@Column(name="created_by", nullable = false)
private long createdBy;
@Column(name="created_date", nullable = false)
@Convert(converter = InstantPersistenceConverter.class)
private Instant createdDate;
.
.
.
}
这是我的实体类的超类:
@MappedSuperclass
@EntityListeners(value = { SaveOrUpdateDateListener.class })
public interface LastModifiable{
public void setCreatedDate(Instant instant);
}
当我打印出已注册事件侦听器的列表时,我会在那里看到我的事件侦听器。然而,当我尝试保存或更新实体时,我的事件监听器根本没有被调用。它只调用默认事件侦听器。 我已经看过了 https://jira.spring.io/browse/SPR-9381
所以我也想知道是否有人在上述链接中提出的解决方案示例与 Dropwizard 一起使用。
【问题讨论】:
标签: hibernate event-listener dropwizard