2016-03-15 66 views
0

我按照http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html执行所有操作,但是既没有执行in-bean方法也没有执行外部方法。可能是什么原因?Calback方法不适用于休眠bean

@Entity 
@EntityListeners(EntityListener.class) 
public class User { 
    @Id 
    @Column 
    @GeneratedValue 
    private Integer id; 

    // etc... 

    @PostConstruct 
    @PostLoad 
    @PostPersist 
    @PostUpdate  
    public void magic() { 
     System.out.println("YES I AM EXECUTED!"); 
     System.exit(123); 
    } 
} 

OR

@Entity 
@EntityListeners(MyListener.class) 
public class User { 
    @Id 
    @Column 
    @GeneratedValue 
    private Integer id; 

    // etc...  
} 

+

public class MyListener { 
    @PostPersist 
    void postPersist(Object object) { 
     System.out.println("CAN'T BELEIVE I SEE THIS!"); 
     System.exit(234); 
    } 
} 

我的代码创建,保存和加载豆,但没有任何反应的听众。这是一块库多数民众赞成在执行操作:

@Repository 
public class UserRepositoryImpl implements UserRepository { 
    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public User get(Integer id) { 
     return sessionFactory.getCurrentSession().get(User.class, id); 
    } 

    @Override 
    public User save(User user) { 
     Session session = sessionFactory.getCurrentSession(); 

     user = (User) session.merge(user); 
     session.saveOrUpdate(user); 

     return user; 
    } 

    // etc... 
} 

库的方法是从服务被称为像这样的:

@Service 
@Transactional 
public class UserServiceImpl implements UserService { 
    @Autowired 
    private UserRepository userRepository; 

    @Override 
    public void something() { 
     // just some repo calls + extra logic 
    } 
} 

我不认为我有一些特别的东西在这里做。

+0

你可以展示如何保存和加载实体吗? – Gwaeron

+0

更新了帖子。 –

回答

0

JPA拦截机制仅在通过JPA EntityManager操作实体时起作用,当您直接使用Hibernate Session时它们没有任何作用。

如果您想使用Session API,则必须实施Hibernate native interceptors

+0

看起来不很优雅,这就是为什么我试图避免认同。但好吧...无论如何谢谢你的敏锐和干净的答案! –