gpt4 book ai didi

java - 如何在 hibernate 中处理大型集合

转载 作者:行者123 更新时间:2023-11-30 08:02:56 27 4
gpt4 key购买 nike

我有一个 Entry 实体和一个 Comment 实体。 Entry 实体与 Comment 实体具有 OneToMany 关联:

@Entity
@Table(name="entries")
public class Entry {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;

@OneToMany(mappedBy = "entry", cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Comment> comments = new ArrayList<>();

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public List<Comment> getComments() {
return comments;
}

public boolean containsComment(int commentId) {
return comments.contains(commentId);
}

public Comment getComment(int commentId) {
return comments.get(commentId);
}

public void removeComment(Comment comment) {
comments.remove(comment);
}
}


@Entity
@Table(name="comments")
public class Comment {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public int id;

@ManyToOne
private Entry entry;

public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}

public Entry getEntry() {
return entry;
}

public void setEntry(Entry entry) {
this.entry = entry;
}
}

假设我有一个向后端发送以下请求的单页应用程序:

/deleteComment?entryId=5&commentId=7

我的方法是在 Controller 中通过 entryId 参数获取条目。比起我想调用 containsComment)() 方法的条目实体,我将在其中传递 commentId 请求参数。因此,如果集合包含具有给定 id 的评论或 false,我会得到 true。如果为真,我将调用 getComment() 方法来获取 Comment 实体。最后,我将简单地以评论实体作为参数调用 removeComment() 方法。

在 PHP Doctrine 中,我认为这种方法有效。这在 hibernate 中也是正确的方法吗?

在示例代码中,如果我调用 containsComment() 方法,我会得到以下异常:

org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [public int com.mypackage.Comment.id] by reflection for persistent property [com.mypackage.Comment#id] : 7

请注意,我使用 EXTRA-LAZY 工作,因为评论可以很快获得大量 Collection 。

最佳答案

您可以通过查询来做到这一点,例如如果Comment有对 Entry 的引用使用类似 select c from Comment c where c.id = :commentId and c.entry.id = :entryId 的东西- 如果您收到该评论,那么它就存在并且您可以立即使用它。

删除评论很简单,就去做吧。自 Comment是关系的所有者,删除它也会有效地将其从条目中删除。

不过有个建议:HQL/JPQL 查询使用关键字 id对于 id 属性。在你的情况下没关系,因为id注释为 @Id .但是,如果您有另一个 @Id自从使用 id 以来,查询的行为将与您预期的不同。在查询中将假定您的意思是 @Id字段。

最后是关于 comments.contains(commentId) 的旁注: 像列表这样的 Java 集合通常会查找您作为参数传递的元素,但由于您的集合是 List<Comment>并且你传递了一个 id(这是一个 int )它不应该被发现。我不确定 Hibernate 集合是否采用了一些特殊的翻译逻辑,但对于 Java 程序员来说,调用看起来像一个错误,因为你永远不会期望它返回 true(就像“苹果列表中是否包含这个橙子?”) .

关于java - 如何在 hibernate 中处理大型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36542406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com