2016-03-15 65 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

看起來不很優雅,這就是爲什麼我試圖避免認同。但好吧...無論如何謝謝你的敏銳和乾淨的答案! –