- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正在开发这个“twitter”应用程序,用户可以在其中发布帖子@OneToMany
并且可以拥有关注者@ManyToMany
。
在检索用户时,也会检索其所有帖子和关注者。
这都是正确的,但它还检索每个帖子(即用户本身)的每个“海报”以及每个关注者的所有帖子和关注者。
我不知道如何将此限制为用户本身。
用户
@Entity
@Table(name = "User")
@NamedQueries({
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u"),
@NamedQuery(
name = "User.auth",
query = "SELECT u FROM User u WHERE u.username = :username AND u.password = :password"
)
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
@ManyToMany
@OneToMany(mappedBy = "poster", cascade = CascadeType.ALL)
private List<Post> posts = new ArrayList<>();
@JoinTable(name = "Followers",
joinColumns = {
@JoinColumn(name = "USER_ID", referencedColumnName = "ID")
},
inverseJoinColumns = {
@JoinColumn(name = "FOLLOWER_ID", referencedColumnName = "ID")
}
)
private List<User> followers = new ArrayList<>();
.... constructor, getters and setters
发布
@Entity
@Table(name = "Post")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String content;
@ManyToOne
private User poster;
.... constructor, getters and setters
我得到的结果与我想要的结果
{
"id": 1,
"username": "jim",
"posts": [
{
"id": 1,
"content": "Post 1 by jim",
"poster": {
// ^ this is the user itself (I don't need this one)
"id": 1,
"username": "jim",
"posts": [
// keeps recurse
]
}
}
],
"followers": [
{
"id": 2,
"username": "follower1",
"posts": [
{
"id": 4,
"content": "Post 2 by follower 1",
"poster": {
// ^ this is the follower itself (I don't need this one)
"id": 2,
"username": "follower1",
"posts": [
// Same issue
]
}
}
],
"followers": [], // <-- I don't need this one either
}
]
}
很明显,获取一个用户填充会不断获取其所有递归关系。
这是设计师的错误还是可以忽略/限制?
注意:我使用 Gson 将对象序列化为 JSON 格式
更新
尝试使用:
@ManyToOne(fetch = FetchType.LAZY)
private User poster;
它有效,但仍然在 JSON 中获得以下额外的 Prop ,因此不确定这是否是一个简洁的解决方案:
"_persistence_poster_vh": {
"sourceAttributeName": "poster",
"isInstantiated": false,
"row": {
"Post.ID": 3,
"Post.CONTENT": "Post 3 by jim",
"Post.DATETIME": "2018-01-22",
"Post.POSTER_ID": 1
},
"isCoordinatedWithProperty": false
}
还有
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
...
)
private List<User> followers = new ArrayList<>();
它仍然返回所有关注者(我想要的!)我只是不想要followers.followers和followers.posts..
最佳答案
最佳猜测:在您尝试取消引用这些对象之前,它实际上并没有获取这些对象。
默认情况下,JPA 将急切获取 @OneToOne 和 @OneToMany 关系,但不会获取 @ManyToOne 或 @ManyToMany。发生的情况是,当您引用这些字段时,它将去获取列表的实际内容。
你怎么知道这种情况正在发生?使用 getFollowers().getClass() 检查列表的类您看到的不会是 LinkedList 或 ArrayList,而是 JPA 提供者提供的一个类,名称中可能带有“Lazy”。当您在列表上调用 Size 或 Get 时,它将执行获取。
您也可以将 OneToOne 和 OneToMany 关系设置为惰性关系,并使用 EntityGraphs 来确定您想要急切获取哪些实体。 JPA 有很多这样的陷阱。
我已经看到提到过 GSON,只是一个警告:它不会意识到延迟加载列表,所以你必须告诉它避免使用你不希望它遵循的属性。
通常使用 JSON 编码(marshal)处理时,您会希望它忽略父对象,因此在 Post 中,应忽略 User。另外,到相同类型的链接通常应该被忽略(关注者)或者专门映射,这样它就不会编码整个对象,而只生成用户名数组。您可以告诉它忽略实际的关注者字段,并让它编码一个返回用户名数组的 getter 来实现此目的。
关于java - JPA 检索所有引用的关系(ManyToMany - ManyToOne - OneToMany),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49027819/
经过大量搜索但没有成功后,我决定在这里提出我的问题,所以我将首先举一个例子来说明问题。 我有 4 个类(class) A - B - C - D我在 A 和 B 之间有一个名为 A_B 的多对多关系(
该应用程序允许用户选择某些关键字(我们监控 TwitterStream) 每个关键字都包含包含其关键字的推文 ID 列表。 public class Keyword extends Model { @
我有 2 个实体:User 和 UsersList。 @Entity @Table(name = "USERS") public class User { @Id @Generated
嘿,我有一个关于人际关系的问题。 我希望用户有友谊。所以一个用户可以成为另一个用户的 friend 。我假设我需要通过 Friendship 表使用 ManyToManyField。但我无法让它工作。
我需要让帖子接受我需要的尽可能多的语言,所以我有两个模型 post和 language在后模型中: public function languages(){ return $this->bel
在我的一个模型中,我有一个属于多条配置的类别字段。 我想知道如何在模板中获得以下输出。 第 1 类、第 2 类、第 3 类和第 4 类 所以基本上用逗号分隔每个类别,除了最后一个用“和”替换 最佳答案
我有一个用于 User 和 House 的多对多表,称为 user_house。我不想只添加两列:user_id 和 house_id,而是添加 3 列:例如,action、created_at、up
我正在做一个食品卡车 API,只是为了学习 spring-boot。在做的过程中,遇到了关于注释 @Manytomany 如何工作的问题。 因为这个项目只是为了学习我想使用Google CLoud F
我有一个ManyToMany链接和一个链接三个对象的外键。 [A]>-----[C] A 可以属于多个 B,反之亦然。但是,A 只能属于具有同一父对象 C 的 B 对象。 我正在尝试在模型的 clea
如果我有两个模型与直通模型具有多对多关系,我如何从该“直通”表中获取数据。 class Bike(models.Model): nickname = models.CharField(max_l
我已经处理我的用户 - 角色 - 映射问题很长一段时间了,但我目前陷入这个问题: 调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException:使用 @On
我在坚持方面遇到了问题。我有一个膳食类(class),其中有产品列表。在 Product 类中是一个 Meals 列表——@ManyToMany 关系。 当我尝试保存它时,编译器想要保存每个产品,但随
我正在学习 Spring JPA,我从将对象映射到表开始。我对 OneToOne 和 OneToMany 关系没有任何问题,但我不太明白为什么我无法保留与 ManyToMany 关系相关的对象。我有一
我在 MySQL 中创建了表:role tabel 、 object_label 和 role_object_label (链接表) 我定义了@ManyToMany,但出现异常。我的代码有什么问题?
我有一个包含多个延迟初始化集合的类,其中包括 OneToMany 和 ManyToMany。 ManyToMany 关系是单向的,因此 Expert 类没有 Project 集合。 @OneToMan
我阅读了很多关于这个问题的链接: How to save a django model with a manyToMany Through relationship, AND regular many
我已经实现了一个多图像上传方法,但我想知道使用哪些字段/小部件能够将图像 ID 与表单一起传递。 在填写表单时异步添加图像,并且在提交时,这些图像将被分配给表单正在添加/编辑的对象。我怎样才能传递这个
我遇到了一个尚未解决的问题。 环境: MySQL 5 操作系统 hibernate 4.1 Spring 3.1 Spring Data JPA 我有两个处于多对多关系的实体。为此,我使用带有外键的联
我有两个实体 Post 和 Tags 这个实体有 ManyToMany 的关系,很多帖子有很多标签,很多标签有很多帖子,并且有实体类别我有一个类别的很多帖子,我需要创建 Action 来查找类别的帖子
我的类(class)类(class) @Entity public class Course { @Column @Id private String courseCode;
我是一名优秀的程序员,十分优秀!