我仍在尝试围绕@Transactional的工作原理。
我@Transactional
在Service类的方法上有注释,而@Modifying
在Repository类中的方法上有注释。带@Transactional
注释的方法是否适用于带注释的存储库中的方法@Modifying
?
我的理解:
@Transactional
在@Transactional( readOnly = true )
没有数据的类的方法上,将数据写入数据库,而使用时@Transactional
,则将数据写入数据库。
修改查询
- 修改方法签名只能返回
void
,Integer
或者int
- 更新查询必须是事务性的,标记为
@Transactional
- Spring
Data将删除所有未刷新的未处理更改EntityManager
,更改为@Modifying(clearAutomatically=false)
第二点说@Modifying
查询必须具有@Transactional(readOnly=false)
,因此我们可以在@Service
方法调用@Repository
级别或方法级别调用中添加查询。如果在@Service
级别上添加,它也适用于@Respository
从@Service
级别方法调用中调用的方法?
例:
@Service
class AnimalServiceImpl implements AnimalService {
@Autowire
AnimalRepository animalRepository;
@Override
@Transactional
public void persistAnimal() {
....
animalRepository.save();
}
@Override
@Transactional(readOnly = true)
public void checkIfAnimalPresent() {
...
animalRepository.checkIfPresent();
}
@Override
@Transactional
public void deleteAnimal() {
...
animalRepository.deleteAnimal();
}
}
资料库
@Repository
@Transactional(readOnly=true)
public interface AnimalRepository extends org.springframework.data.repository.Repository {
@Modifying
@Query(...)
void save();
@Modifying
@Query(...)
int checkIfPresent()
@Modifing
@Query(..)
int deleteAnimal();
}
我的问题是:
@Transactional
当我们在存储库@Repository
级别拥有服务类并且我拥有@Modifying
修改实体并将其写入数据库的方法时,为什么需要服务类(仅因为我@Transactional(readOnly = true)
在类级别拥有)?@Transactional
Service类上的注释是否会推广到@Repository
类?我希望我对这里的问题和例子很清楚。
这是如何@Transactional
工作的:
默认情况下,存储库实例上的CRUD方法是事务性的。
对于读取操作,事务配置readOnly
标志设置为true
。
所有其他文件均配置为普通格式,@Transactional
以便应用默认事务配置。
如果需要调整存储库中声明的方法之一的事务配置,则可以覆盖该方法并添加@Transactional
具有必需属性值的注释。
更改事务行为的另一种方法是使用外观或服务实现(通常)覆盖多个存储库。
其目的是为非CRUD操作定义事务边界。
如果使用这种方法,则存储库中的事务配置将被忽略,因为外部事务(在服务层中定义)配置决定了实际使用的事务。
参考:Spring Data JPA-参考文档-5.7。交易性
问题内容: 昨天,当我回答使用迭代器并删除时出现ConcurrentModificationException错误的问题时,我添加了一条通知 当您有ArrayLists时,使用迭代器不是一个好主意。 您无需深刻理解该问题即可回答该问题。 在那里,我有两条评论是我错了。 我的论点: 迭代器不易读取代码。 有可能引发难以调试的ConcurrentModificationException。 你能解释一
我正在使用mockito作为junit。在创建对象的模拟时,我有疑问。我有一个名为DBConnect的类。我需要数据库属性,如dbname、凭据等。PatientDetails使用这个类。现在,当我为PatientDetails编写junit时。所以我使用以下代码。 用这个我不能得到正确的结果。
问题内容: 我知道从同一个类内部调用事务方法时,它不会在事务中运行。Spring为事务方法创建代理,并将它们包装在try- catch块中,如果发生异常,则回滚。请考虑以下情形: 假设已从另一个对象调用,并且中发生了异常,因此成功完成但未成功。据我所知,尽管并且不是事务性的(因为它们是从同一个对象中调用的),但由于它是事务性的,因此仍应回滚。 我不明白的是,为什么人们说自我调用会破坏交易?只要调用
我阅读了一些文章,发现:默认情况下,预启用了以下HttpMessageConverters实例: ByteArrayHttpMessageConverter-转换字节数组 StringHttpMessageConverter-转换字符串 ResourceHttpMessageConverter-转换org.springframework.core.io.resource用于任何类型的八位组流 So
问题内容: 我有一个非常简单的文件: 而且有效。 但是,当我删除元素时,应用程序看不到实体(所有类都带有注释)。 是否有自动扫描类的机制? 问题答案: 你可以使用 该文件定义了一个名为的持久性单元,它使用JTA感知数据源。所述和元素指定管持久类:实体类,可嵌入类和超类映射。该元素指定JAR文件都包含持久化类管理的打包持久单元可见,而该class元素明确命名持久化类管理。 对于,也可以进行设置和配置
问题内容: 我想在我的JavaScript代码中包含几个JSON文件,这些文件与JavaScript源文件位于同一目录中。 如果我想包含另一个JavaScript文件,可以直接使用。现在,我正在使用和获取JSON,我认为这是执行此操作的丑陋方法。 是否有类似的要求,使我能够加载JSON文件? 问题答案: 从节点v0.5.x开始,是的,您可以像需要js文件一样要求JSON。 在ES6中: