- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!