gus*_*gus 13 java jpa one-to-many
有没有办法限制JPA中@OneToMany关系的列表大小?这是我的代码示例:
@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
private List<Comment> commentList;
Run Code Online (Sandbox Code Playgroud)
我正在使用EclipseLink 2.3 JPA实现.提前致谢.
jeh*_*eha 19
Bean验证规范(JSR-303)的一部分是@Size(min=, max=)注释:
支持的类型是String,Collection,Map和数组.检查带注释的元素大小是否在最小值和最大值(包括)之间.
您可以验证该集合.
@OneToMany(mappedBy = "publication", cascade=CascadeType.PERSIST)
@Size(min=1, max=10)
private List<Comment> commentList;
Run Code Online (Sandbox Code Playgroud)
真正的问题是集合本身。您不应该以这种方式对您的业务领域进行建模。此解决方案(用 注释的集合@OneToMany)仅适用于小型集合(数十个对象),而不适用于大型集合(数千个对象),这很可能是带有注释的情况。你真的必须小心他们,因为他们很快就会失控。我目前使用它们只是为了对Role与 关联的 s集合进行建模Account,因为我知道在我的域中没有帐户拥有超过 9 个角色,并且帐户所处的角色对于与帐户。对于所有其他 m-to-n 关系,我使用普通的旧查询。
不要向对象添加注释集合,而是添加对对象的引用Comment并使用查询显式获取所需的注释。
定义一个命名查询来Comment获取某个对象的注释(让我们使用Article):
@Entity
@NamedQueries(value={
@NamedQuery(name=Comment.FOR_ARTICLE, query=
"SELECT c FROM Comment c WHERE c.article = :article"
)
})
public class Comment {
// ...
@ManyToOne
@JoinColumn(name = "articleId")
private Article article;
}
Run Code Online (Sandbox Code Playgroud)
然后,使用命名查询 icw Query.setMaxResults和Query.setFirstResult显式控制要获取的结果数量并允许分页等:
@PersistenceContext
EntityManager em;
Article theArticle = ...;
Query query = em.createNamedQuery(Comment.FOR_ARTICLE, Comment.class);
query.setParameter("article", theArticle);
query.setFirstResult(0);
query.setMaxResults(10);
List<Comment> comments = (List<Comment>) query.getResultList();
Run Code Online (Sandbox Code Playgroud)
进行分页时,只需setFirstResult到与您要显示的页面对应的第一个结果即可。EG 要显示结果 20 .. 29,您可以调用
setFirstResult(20).
| 归档时间: |
|
| 查看次数: |
15329 次 |
| 最近记录: |