Java 在我的托管bean中管理事务回滚

Java 在我的托管bean中管理事务回滚,java,spring,hibernate,transactions,rollback,Java,Spring,Hibernate,Transactions,Rollback,我正在使用JPA/hibernate、Spring和JSF。 因此,我的应用程序组织如下: 我有我的实体, 每个实体的我的Dao接口和实现,其中我定义了基本方法:findById,添加,更新,删除。。。 然后我有了我的服务层,它只使用DAO接口,其中的方法基本上与我的DAO中的方法相同。 我的问题是,在我的支持bean中,我有一个方法Add_hospital(),它添加了一家医院,还为该医院提供服务,因此我的方法如下 add_hospital(){ add-hospital(); add-s

我正在使用JPA/hibernate、Spring和JSF。
因此,我的应用程序组织如下:
我有我的实体,
每个实体的我的Dao接口和实现,其中我定义了基本方法:
findById
添加
更新
删除
。。。 然后我有了我的服务层,它只使用DAO接口,其中的方法基本上与我的DAO中的方法相同。
我的问题是,在我的支持bean中,我有一个方法
Add_hospital()
,它添加了一家医院,还为该医院提供服务,因此我的方法如下

add_hospital(){ 
add-hospital(); 
add-services();
add-Hospital-schedule();
}
所以这个方法是一个事务,我希望如果发生了一些问题,事务回滚,但是我知道回滚需要在我的DAO中管理,我需要在我的托管bean中定义我的方法
Add_hospital()
,在这个阶段,我有这个插入组合。

请说明如何解决此问题?

事务应该在服务层上管理,而不是在数据访问上。 示例来自:


谢谢@jonasnas的回答。这意味着我的方法add_hospital()包含所有其他方法,需要在我的服务层中定义,我教过,在服务层中,我们只需要定义基本方法,每个服务类只需要管理一个实体。通常您有创建/删除/更新/更新/删除医院(可以更多)。您不必担心这一层的事务。然后在服务层中,若您只需要createHospital(),那个么您将创建事务性方法并在其中调用单个方法dao.createHospital。但是,如果您需要创建一个从dao执行多个调用的方法,那么您可以创建事务性方法,并在其中放置多个dao调用。服务层的思想是,您的代码在使用它时不需要了解任何有关底层的信息。例如,在您的代码中,您调用(事务性)hospitalService.scheduleAppointment(医院、个人),但您不关心它是否与数据库通信、是否将其存储在内存中或是否调用Web服务。另外,如果您将事务放在DAO级别,它可能很难在其他服务中重用,这些服务需要在同一事务中执行额外的db调用。谢谢您,所以@jonasnas现在对我来说更清楚了:)
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {

    public Foo getFoo(String fooName) {
        // do something
    }

    // these settings have precedence for this method
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void updateFoo(Foo foo) {
        // do something
    }
}