我有一个JPA注释类,其中包含如下集合:
@Entity
public class Employee {
@Id
private int id;
@Basic
private String name;
@OneToMany
@JoinTable(name = "ORG", joinColumns = @JoinColumn(name="MINION"),
inverseJoinColumns = @JoinColumn(name="EMP"))
private List<Employee> minions = new ArrayList<Employee>();
@PreUpdate
public void preUpdate(){ ... }
}
Run Code Online (Sandbox Code Playgroud)
我所看到的是,如果我有一个托管的Employee实体,并且我添加了它的minions集合,preUpdate则不会调用该方法.在DB中的映射表中添加了一个新行,因此我知道更新正在进行中.如果我直接在Employee上更改属性(如name),则会preUpdate在提交事务时按预期触发.
有没有办法在修改映射集合时触发PreUpdate?或者是否有其他技术或Hibernate特定注释用于检测何时发生?
我习惯使用Spring来执行依赖注入,如下所示:
<context:component-scan base-package="org.emmerich.myapp" />
Run Code Online (Sandbox Code Playgroud)
然后用Autowired这样注释我的依赖类:
public class DependentClass {
@Autowired
private Dependency dependency;
}
Run Code Online (Sandbox Code Playgroud)
但是,随着Hibernate 4.0的变化,我们现在建议使用新Integrator接口进行服务发现.这包括添加事件侦听器触发器如postUpdate,postDelete等
不幸的是,这与通过注释依赖项的依赖注入不能很好地协作.我有以下设置:
我已经定义了一个集成器来添加我的监听器ServiceFactory.这在文件中引用META-INF/services/org.hibernate.integrator.spi.Integrator.
public class MyIntegrator implements Integrator {
private MyListener listener;
public MyIntegrator() {
listener = new MyListener();
}
@Override
public void integrate(Configuration configuration,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
final EventListenerRegistry eventRegistry =
serviceRegistry.getService(EventListenerRegistry.class);
eventRegistry.prependListeners(EventType.POST_COMMIT_INSERT, listener);
}
Run Code Online (Sandbox Code Playgroud)
我也定义了类MyListener,它看起来像你典型的事件监听器.
@Component
public class MyListener implements PostInsertEventListener {
@Autowired
private Dependent dependent;
public …Run Code Online (Sandbox Code Playgroud) @PreUpdate一旦我的实体发生变化,我就会使用 EntityListeners ( ) 来执行某些操作。但是我注意到实体内集合的更改不会触发 JPA 实体侦听器,这是有道理的,因为包含实体的表没有更改,而是多对多表。
有没有办法在集合更改的情况下使实体侦听器触发?
我已经实现了Hibernate事件的前/后事件监听器,但有一点我无法克服.我有一个与Departments实体有多对多关系的Centers实体.将新中心分配给部门时,我只需调用:
oDepartment.addCenter(oCenter);
entitySave(oDepartment);
Run Code Online (Sandbox Code Playgroud)
当发生这种情况时,我希望Hibernate在我修改实体后触发preUpdate和postUpdate事件.但是,除非列属性也更新,否则永远不会触发它.仅更新关系属性似乎不会触发更新事件.
通过当前的Hibernate会话,我似乎无法找到任何允许我设置某种触发这些事件的标志.
关于我可以解雇这些事件的方法的想法?
hibernate ×3
java ×3
jpa ×2
orm ×2
coldfusion ×1
listener ×1
persistence ×1
spring ×1
spring-mvc ×1