我尝试了很多不同的东西,做了大量的研究,但仍然无法完成以下工作:我想@NamedEntityGraph在一个实体上定义一个,但我引用的属性位于父类中,该类定义为@MappedSuperclass.
我有轻微的感觉(在检查代码如何构建实体图之后),这不起作用,但也许有人可以对它有所了解.
这里详细介绍了我们要做的事情(缩短了一些事情):
@MappedSuperclass
public class UserBase {
private Long id;
private String loginname;
private String password;
@ManyToMany(fetch = FetchType.LAZY)
private Set<Role> roles;
....
}
Run Code Online (Sandbox Code Playgroud)
而实际的实体:
@Entity
@NamedEntityGraph(
name = "withRoles",
attributeNodes = { @NamedAttributeNode("roles") })
public class User extends UserBase {
....
}
Run Code Online (Sandbox Code Playgroud)
会发生什么,我们得到错误
Unable to locate Attribute with the the given name [roles] on this ManagedType [some.package.path.User]
Run Code Online (Sandbox Code Playgroud)
单步执行图创建代码,我可以看到它只查看类本身定义的属性,而不是超类型.我有可能以这种方式定义图形,这有效吗?
谢谢你的任何提示!
我们遇到了以下我们理解的行为,但是我们想知道它是否是预期的,以及将它记录为某种陷阱可能是有意义的.
我们正在试验Spring Boot 2/Spring WebFlux并设置一个基本上有这样的东西的小应用程序(全部缩短):
@PostMapping
public Mono<Todo> addTodos( @RequestBody Person person ) {
return personService.addPerson( person );
}
Run Code Online (Sandbox Code Playgroud)
该服务首先看起来像这样,因为我们想要将一个人的事件也发布到消息队列:
public class PersonService {
public Mono<Person> addPerson( Person person ) {
Mono<Person> addedPerson = personRepository.save( person );
addedPerson.subscribe( p -> rabbitTemplate.convertAndSend( "persons", p ) );
return addedPerson;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,这样做显然是错误的.该.subscribe()触发器的流动和我们假设反应REST控制器确实在背景相同的序列化的数据的响应,从而导致第二平行流动之前.最后,我们最终persons在数据库中的集合中有两个重复的条目.
在这个冗长的介绍之后,最后的问题是:这是多个订阅者触发多个插入的预期行为(基本上,如果您订阅n时间,您会获得n插入)?
如果是的话,这对于初学者来说可能是一个陷阱,特别是如果我们的理解是正确的,那么反应式REST控制器就会发挥作用.subscribe().
spring spring-mvc spring-data-mongodb project-reactor reactive