簡體   English   中英

如何將Hibernate實體對象傳遞給另一種方法以保存到數據庫?

[英]How to pass a Hibernate entity object to another method to save to database?

我有一個EJB,它訪問一個實體並用新數據更新它,並將其發送到JMS隊列,然后由MDB消耗,該MDB應該實現將實體保存/持久化到數據庫的代碼。 這是從數據庫訪問實體的EJB:

AccountAccessBean.java

@Stateless(mappedName = "AccountAccessBean")
@TransactionManagement(value=TransactionManagementType.CONTAINER)
@LocalBean
public class AccountAccessBean {

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void resigterAccountEvent() {

        Calendar calendar = Calendar.getInstance();
        Date now = calendar.getTime();

        Configuration configuration = new Configuration().configure();
        ServiceRegistry registry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties())
                .build();
        SessionFactory sessionFactory = configuration
                .addAnnotatedClass(Account.class)
                .addAnnotatedClass(Accountaccesslog.class)
                .buildSessionFactory(registry);
        Session session = sessionFactory.openSession();     
        Transaction transaction = session.beginTransaction();

        Account accountEntity = (Account) session.get(Account.class, new Integer(1));
        accountEntity.setAccessCount(accountEntity.getAccessCount() + 1);

        Accountaccesslog accountAccessLogEntity = new Accountaccesslog();
        accountAccessLogEntity.setAccessDateTime(new Timestamp(now.getTime()));
        accountEntity.addAccountaccesslog(accountAccessLogEntity);
        session.save(accountAccessLogEntity);

        transaction.commit();
        session.close();

        EntityEnqueueBean enqueueObject = new EntityEnqueueBean();
        enqueueObject.enqueueEntity(accountEntity);
    }
}

當前,此Bean更新實體,並自行將更改提交到數據庫。 我想將代碼的“提交”部分移至以下接收JMS消息的MDB:

AccountPersistenceMDB.java

@MessageDriven(
    activationConfig = { @ActivationConfigProperty(
            propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty( propertyName = "destination", 
            propertyValue ="java:/jms/queue/AccountAccessQueue")
    })
public class AccountPersitenceMDB implements MessageListener {

    public void onMessage(Message message) {
        ObjectMessage objectMessage = null;
        objectMessage = (ObjectMessage) message;
        try {
            Account accountEntity = (Account) objectMessage.getObject();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

我不確定如何實現這一點。 我還需要將會話或事務對象與accountEntity對象一起傳遞嗎? 任何幫助或指導,我們將不勝感激。

你有兩個操作

  1. 訪問實體並發送JMS消息
  2. 消耗JMS消息並提交到數據庫

您的交易不能也不應同時涉及這兩種操作

JMS消息可以

  1. 如果消費者不能足夠快地消費,請排隊
  2. 被多個消費者消費
  3. 重播
  4. 與發布者在另一台機器上消費

有關將JMS消耗和數據庫提交合並為單個事務的更多信息,請參見此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM