- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的网络应用程序中,在服务布局中,我使用“餐厅”实体的代理(“餐厅”字段上的 FetchType.Lazy)。
User user = userRepository.get(userId);
/*
Getting proxy here, not restaurant object
*/
Restaurant userRestaurantRef = user.getRestaurant();
if (userRestaurantRef != null){
restaurantRepository.decreaseRating(userRestaurantRef.getId());
}
restaurantRepository.increaseRating(restaurantId);
/*
"getReference" invokes "getOne()"
*/
user.setRestaurant(restaurantRepository.getReference(restaurantId));
userRepository.save(user);
在测试中通过 Controller 调用此方法后,所有其他 RestaurantRepository 的获取方法(例如 findById())返回也代理。
但是,如果我在我的服务方法之前调用“findById()”方法,就没问题。
例如:
mockMvc.perform(put(REST_URL + RESTAURANT1_ID)
.param("time", "10:30")
.with(userHttpBasic(USER)))
.andExpect(status().isNoContent());
Restaurant restaurant = restaurantRepository.get(RESTAURANT1_ID);
“餐厅”是代理
Restaurant restaurantBefore = restaurantRepository.get(RESTAURANT1_ID);
mockMvc.perform(put(REST_URL + RESTAURANT1_ID)
.param("time", "10:30")
.with(userHttpBasic(USER)))
.andExpect(status().isNoContent());
Restaurant restaurantAfter = restaurantRepository.get(RESTAURANT1_ID);
“restaurantAfter”是真实对象
“get()”进入存储库:
@Override
public Restaurant get(int id) {
return repository.findById(id).orElse(null);
}
最佳答案
您是否在方法或服务类本身上有 @Transactional
注释?
这可以解释观察到的行为。
当一个方法在事务中执行时,从数据库获取或合并/保存到数据库的实体被缓存直到事务结束(通常是方法结束)。这意味着任何对具有相同 ID 的实体的调用都将直接从缓存中返回,而不会访问数据库。
这里有一些关于 Hibernate 的缓存和代理的文章:
回到你的例子:
findById(id)
,然后调用getOne(id)
为两者返回相同的实体对象getOne(id)
然后 findById(id)
为两者返回相同的代理那是因为它们共享相同的id
并且在同一个事务中执行。
关于 getOne()
的文档指出它可以返回一个实例
而不是引用 (HibernateProxy),因此让它返回一个实体可以预计:
T getOne(ID id)
Returns a reference to the entity with the given identifier.
Depending on how the JPA persistence provider is implemented this is very likely to always return an instance and throw an EntityNotFoundException on first access. Some of them will reject invalid identifiers immediately.
Parameters: id - must not be null.
Returns: a reference to the entity with the given identifier.
另一方面,关于 findById()
的文档没有任何关于它可以返回任何东西的提示,除了实体的 Optional
或空的 Optional
:
Optional findById(ID id)
Retrieves an entity by its id.
Parameters: id - must not be null.
Returns: the entity with the given id or Optional#empty() if none found
我花了一些时间寻找更好的解释,但没有找到,所以我不确定它是 findById()
实现中的一个错误还是只是一个错误(好)记录的功能。
作为解决问题的方法,我建议:
@Transactional
。交易也可以手动管理。以下是关于该主题的一些好文章:
import javax.persistence.EntityManager;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class SomeServiceImpl implements SomeService {
private final SomeRepository repository;
private final EntityManager entityManager;
// constructor, autowiring
@Override
public void someMethod(long id) {
SomeEntity getOne = repository.getOne(id); // Proxy -> added to cache
entityManager.detach(getOne); // removes getOne from the cache
SomeEntity findById = repository.findById(id).get(); // Entity from the DB
}
clear()
方法一次删除所有对象:import javax.persistence.EntityManager;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class SomeServiceImpl implements SomeService {
private final SomeRepository repository;
private final EntityManager entityManager;
// constructor, autowiring
@Override
public void someMethod(long id) {
SomeEntity getOne = repository.getOne(id); // Proxy -> added to cache
entityManager.clear(); // clears the cache
SomeEntity findById = repository.findById(id).get(); // Entity from the DB
}
相关文章:
编辑:
这是一个simple project展示问题或功能(取决于观点)。
关于java - 为什么在同一实体上调用 getOne() 后 "findById()"返回代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58509408/
我想从特定的本地对象中检索数据 var db=[ { "_id": "543adb9c7a0f149e3ac29438", "name": "user1", "email":
即使数据库中存在 id,以下 findById() 也会返回 null: router.get('/product/:id', function (req, res) { console.log("p
我有以下 dart 类,它加载一个对象和一个图像。当我执行热重载时,函数 findById 返回错误消息 Bad State: No element .在调试时,我看到我正在查询的列表是空的,一旦我进
我有运行 Mongoose 并成功返回以下结果的代码。 为什么我不能执行以下操作并从我的对象中获取值? Object.keys(result).forEach(function(record){
尝试使用 Axios.get 方法获取 ':id'S̶e̶r̶v̶e̶r̶̶i̶s̶̶r̶e̶s̶p̶o̶n̶d̶i̶n̶g̶̶w̶i̶t̶h̶̶a̶̶4̶0̶4̶ 目前我无法设置组件的状态。我得到一
hibernate 有一个特殊的问题。我有一个像这样的 hibernate 功能。 @SuppressWarnings("unchecked") public List findByResponseI
我在网上找到了以下代码,用于从数据库中获取对象。现在lock表示什么?什么时候锁? public T findById(ID id, boolean lock) { T entity;
我在使用 spring 3 和 hibernate-core 3.5.1-Final 的网络应用程序中遇到了一个非常奇怪的行为。 为了简单起见,我提供了我的代码.. if(ripid!=null){
我创建了 2 个表,名为:groupusermaps 和 groups。从 groupusermaps 中,我获取所有 groupId,并且这些 groupId 传入 findById() 方法,以获
我有三个实体。(我使用 xxx 作为这个例子的占位符) 我已经设置了他们所有的 @Entities与 @Entity @Table(name = "xxx") public class xxx { @
PHP 版本:5.2.17 CakePHP 版本:1.3.11 MySQL版本:5.5.9 我正在为客户开发一个非常简单的内部留言板网站。由于它仅供内部使用,因此客户要求没有用户名和密码,只有密码。没
我们有一个使用“findById”的非常简单的方法。 public Cart getCart(long cartId) { Cart cart = null; try {
我正在运行 Mongoose,我有一个工作连接,并且 findById()有时会返回结果: 情况1:无意义查询 models.Repo.findById("somefakeid", function(
列表项 var express = require("express"); var app = express(); var Mongoose = require("Mongoose"); Mongo
我正在尝试通过 mongodb 的对象 ID 获取项目对象,但是当我尝试在 postman 中调用该路由时,它会为我提供数据库中每个对象的列表(总共 4 个对象),而不是预期一个对象。 这是我为从数据
我有一个 Mongoose 模型,例如; var Schema = new Schema({ title: { type: String, required: true }, subtitle
我正在使用 mongoose 调用 findById,它没有返回所有字段,或者至少没有正确映射到字段。但如果我使用聚合,它会返回该字段 我有以下架构 const ratingSchema = new
我在使用 ButterKnife 时遇到此错误: error: cannot find symbol method findById(View,int) TextView tvHeaderTextOn
使用 Hibernate 获取的实体的所有字段都设置为 NULL。我怎样才能避免这种情况?这是我的 Jpa 存储库。 @Repository public interface PolicyReposi
我正在使用 Spring 和 JPA(带有 MySQL 的 Hibernate)以及 Lombok。 您好,我的实体的这一部分: @Data @AllArgsConstructor @NoArgsCo
我是一名优秀的程序员,十分优秀!