2014-08-29 30 views
0

我是新来的休眠。请帮我设计下面的场景。如何在预订网站中处理休眠事务

在预订网站中,用户可以单独预订机票,也可以预订机票和酒店。我如何设计hibernate中的事务管理,以便在下面的情况下将全部填满。

预订了两个航班和酒店的用户,

1:机票预订已成功,但酒店预订不能因为一些系统问题。在这种情况下,航班预订数据库将成功提交,但酒店数据库应该回滚。

2:两个预订都成功完成。两个表都犯了。

3:如果航班预订失败,则预订都会失败。这两个表应该承诺。

感谢

+0

“帮我设计......”是什么意思?你想知道你需要哪个实体吗? – MrPixelDream 2014-08-29 04:52:06

+0

我想,他在问如何实现这个场景。在假日预订的现实世界中,超出了这一点。在将预订保存到数据库之前有很多事情要考虑(在使用休眠之前)。在这种套餐预订中有几个州需要考虑。 – indika 2014-08-29 04:58:32

回答

1

假设你会用弹簧及以下Hibernate是你的问题的高层次的设计: -

  1. 创建2个实体的一个映射到航班预定表和其他的酒店预订表。

  2. 创建2个DAO(spring @ Repository),它负责管理航班预订的任何变更,另一个负责酒店预订表。

  3. 在Flight Booking DAO/Repository中创建一个名为bookFlight的方法,并处理所有异常,并将其包装在自定义的FlightBookingException checked异常中,并将其重新引发给调用者。在这种方法中,您可以考虑使用上述航班hibernate实体来保存航班详细信息。

  4. 在Hotel Booking DAO/Repository中创建一个名为bookHotel的方法,并处理任何异常并将其封装在自定义的HotelBookingException中,并用适当的消息重新抛出它。再次,在这种方法中,您可以考虑使用上述酒店休眠实体来坚持酒店的细节。

  5. 创建一个服务层(春@服务)到您自动装配这2 DAO的,并创建标注有@Transactional的方法称为bookflightandhotel方法和调用此bookflightandhotel内这2种DAO方法(第一次飞行,然后酒店)方法。

现在默认春天亘古当检查异常被抛出这就是为什么你需要使用@Transactional注释的回滚功能来标记只有FlightBookingException回滚事务。 (例如: - @Transactional(rollbackFor = FlightBookingException.class))。这是为了达到上述问题中的第1点和第3点。

现在在spring配置文件中,你需要配置JtaTransactionManager中(参考文档Spring Transaction

最后,你可以写一个Spring Junit的测试功能。如果您有任何疑问,请告诉我们。

1

检查两阶段提交。你可能想围绕这些想法开发一些东西。

一种方式可能是您去机票预订系统并锁定资源。然后你去酒店预订系统,并尝试预订。如果预订成功,那么你去预订航班。正如你持有锁的资源,你应该能够做到这一点。但是有些情况需要你照顾。