我是新来的冬眠。请帮助我设计以下方案。
在预订站点中,用户可以单独预订机票,也可以预订机票和酒店。我如何在休眠状态下设计事务管理,以便在以下情况下可以完全使用。
订了机票和酒店的用户,
1:航班预订已成功,但由于某些系统问题而无法预订酒店。在这种情况下,将成功提交航班预订数据库,但酒店数据库应回滚。
2:两个预订均成功完成。两者都提交表。
3:如果航班预订失败,则两个预订都将失败。两个表都应该提交。
谢谢
最佳答案
假设您将在下面使用spring和hibernate是问题的高级设计:
创建2个实体,一个映射到“航班预订”表,另一个映射到“酒店预订”表。
创建2个DAO(spring @Repository),一个DAO负责航班预订的任何更改,另一个负责酒店预订表的更改。
在Flight Booking DAO / Repository中创建一个名为bookFlight的方法,并处理所有异常,并将其包装在一个经过FlightBookingException检查的自定义异常中,然后将其重新扔给调用方。在这种方法中,您可以考虑使用上面的航班休眠实体来保留航班详细信息。
在酒店预订DAO /存储库中创建一个名为bookHotel的方法,并处理所有异常,然后将其包装在自定义的HotelBookingException中,并使用适当的消息将其重新抛出。同样,在此方法中,您可以考虑使用上述酒店休眠实体来保留酒店详细信息。
创建一个服务层(Spring @Service),将这2个DAO自动连接到该服务层,并创建一个名为bookflightandhotel方法的方法,该方法以@Transactional进行注释,并在此bookflightandhotel方法中调用这2个DAO方法(先是航班,然后是hotel)。
现在默认情况下,在引发检查的异常时,spring不会回滚事务,这就是为什么您需要使用@Transactional批注的回滚功能仅标记FlightBookingException的原因。 (例如:-@Transactional(rollbackFor = FlightBookingException.class))。这样做是为了实现上述问题中的第1点和第3点。
现在在spring配置文件中,您需要配置JTATransactionManager(请参阅文档Spring Transaction)
最后,您可以编写一个Spring Junit来测试该功能。如果您还有其他疑问,请告诉我们。
关于java - 如何在预订网站中处理 hibernate 交易,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25561818/