And*_*rey 89 java jpa annotation-processing metamodel jpa-2.0
本着与CriteriaQuery相关的类型安全的精神,JPA 2.0还有一个API来支持实体的Metamodel表示.
是否有人知道这个API的全功能实现(生成Metamodel而不是手动创建元模型类)?如果有人也知道在Eclipse中设置它的步骤,那将是非常棒的(我假设它就像设置注释处理器一样简单,但你永远不知道).
编辑:偶然发现了Hibernate JPA 2 Metamodel Generator.但问题仍然存在,因为我找不到jar的任何下载链接.
编辑2:少顷已经过去了,因为我问过这个问题,但我想我会回来,并添加一个链接到SourceForge上的Hibernate JPA模型生成项目
Pas*_*ent 86
如果有人也知道在Eclipse中设置它的步骤会很棒(我假设它就像设置注释处理器一样简单,但你永远不知道)
是的.以下是各种JPA 2.0实现的实现和说明:
org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
org.apache.openjpa.persistence.meta.AnnotationProcessor6
org.datanucleus.jpa.JPACriteriaProcessor
最新的Hibernate实现可在以下位置获得:
较旧的Hibernate实现位于:
Jin*_*won 41
最推荐使用Hibernate.
(我不判断这些实现上的任何特性/功能/可用性/稳定性.上面的语句只关注我构建的maven用法.)
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${version.hibernate-jpamodelgen}</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
OpenJPA似乎需要额外的元素org.hibernate.org:hibernate-jpamodelgen
.
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<compilerArguments>-AaddGeneratedAnnotation=false</compilerArguments> <!-- suppress java.annotation -->
<processors>
<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
</processors>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${version.hibernate-jpamodelgen}</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
EclipseLink需要org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
.
<dependencies>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-Aopenjpa.metamodel=true</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
========================================
对于Apache Maven用户,
以下简单配置似乎有效.(使用旧的maven-compiler-plugin;更新.)
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<processors>
<processor>org.apache.openjpa.persistence.meta.AnnotationProcessor6</processor>
</processors>
<optionMap>
<openjpa.metamodel>true</openjpa.metamodel>
</optionMap>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa</artifactId>
<version>${version.openjpa}</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
你可以用"mvn编译器:编译"来运行它
UPDATE
请注意,此方法仅适用于那些旧的maven-compiler-plugin.检查代码中的版本.
Vla*_*cea 11
假设我们的应用程序使用以下Post
、PostComment
、PostDetails
和Tag
实体,它们形成一对多、一对一和多对多表关系:
hibernate-jpamodelgen
Hibernate ORM 提供的工具可用于扫描项目实体并生成 JPA Criteria Metamodel。您需要做的就是将以下内容添加annotationProcessorPath
到maven-compiler-plugin
Mavenpom.xml
配置文件中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate.version}</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
现在,当编译项目时,您可以看到在target
文件夹中,生成了以下 Java 类:
> tree target/generated-sources/
target/generated-sources/
??? annotations
??? com
??? vladmihalcea
??? book
??? hpjp
??? hibernate
??? forum
? ??? PostComment_.java
? ??? PostDetails_.java
? ??? Post_.java
? ??? Tag_.java
Run Code Online (Sandbox Code Playgroud)
如果Tag
实体映射如下:
@Entity
@Table(name = "tag")
public class Tag {
@Id
private Long id;
private String name;
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
该Tag_
元模型类是这样产生的:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Tag.class)
public abstract class Tag_ {
public static volatile SingularAttribute<Tag, String> name;
public static volatile SingularAttribute<Tag, Long> id;
public static final String NAME = "name";
public static final String ID = "id";
}
Run Code Online (Sandbox Code Playgroud)
该SingularAttribute
用于基本id
和name
Tag
JPA实体的属性。
在Post
实体映射是这样的:
@Entity
@Table(name = "post")
public class Post {
@Id
private Long id;
private String title;
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
@OneToOne(
mappedBy = "post",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY
)
@LazyToOne(LazyToOneOption.NO_PROXY)
private PostDetails details;
@ManyToMany
@JoinTable(
name = "post_tag",
joinColumns = @JoinColumn(name = "post_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private List<Tag> tags = new ArrayList<>();
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
该Post
实体有两个基本属性,id
并且title
,一到多的comments
集合,一个对一个details
的关联,和许多一对多的tags
集合。
该Post_
元模型类生成如下:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Post.class)
public abstract class Post_ {
public static volatile ListAttribute<Post, PostComment> comments;
public static volatile SingularAttribute<Post, PostDetails> details;
public static volatile SingularAttribute<Post, Long> id;
public static volatile SingularAttribute<Post, String> title;
public static volatile ListAttribute<Post, Tag> tags;
public static final String COMMENTS = "comments";
public static final String DETAILS = "details";
public static final String ID = "id";
public static final String TITLE = "title";
public static final String TAGS = "tags";
}
Run Code Online (Sandbox Code Playgroud)
基本id
和title
属性以及一对一details
关联由 a SingularAttribute
whilecomments
和tags
集合由 JPA 表示ListAttribute
。
在PostDetails
实体映射是这样的:
@Entity
@Table(name = "post_details")
public class PostDetails {
@Id
@GeneratedValue
private Long id;
@Column(name = "created_on")
private Date createdOn;
@Column(name = "created_by")
private String createdBy;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "id")
private Post post;
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
所有实体属性都将由SingularAttribute
关联的PostDetails_
Metamodel 类中的 JPA 表示:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(PostDetails.class)
public abstract class PostDetails_ {
public static volatile SingularAttribute<PostDetails, Post> post;
public static volatile SingularAttribute<PostDetails, String> createdBy;
public static volatile SingularAttribute<PostDetails, Long> id;
public static volatile SingularAttribute<PostDetails, Date> createdOn;
public static final String POST = "post";
public static final String CREATED_BY = "createdBy";
public static final String ID = "id";
public static final String CREATED_ON = "createdOn";
}
Run Code Online (Sandbox Code Playgroud)
的PostComment
映射如下:
@Entity
@Table(name = "post_comment")
public class PostComment {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
private String review;
//Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
并且,所有实体属性都由SingularAttribute
关联的PostComments_
元模型类中的 JPA 表示:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(PostComment.class)
public abstract class PostComment_ {
public static volatile SingularAttribute<PostComment, Post> post;
public static volatile SingularAttribute<PostComment, String> review;
public static volatile SingularAttribute<PostComment, Long> id;
public static final String POST = "post";
public static final String REVIEW = "review";
public static final String ID = "id";
}
Run Code Online (Sandbox Code Playgroud)
如果没有 JPA 元模型,需要获取PostComment
由其关联Post
标题过滤的实体的 Criteria API 查询将如下所示:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<PostComment> query = builder.createQuery(PostComment.class);
Root<PostComment> postComment = query.from(PostComment.class);
Join<PostComment, Post> post = postComment.join("post");
query.where(
builder.equal(
post.get("title"),
"High-Performance Java Persistence"
)
);
List<PostComment> comments = entityManager
.createQuery(query)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
请注意,我们post
在创建Join
实例时使用了字符串字面量,而title
在引用Post
title
.
JPA 元模型允许我们避免硬编码实体属性,如以下示例所示:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<PostComment> query = builder.createQuery(PostComment.class);
Root<PostComment> postComment = query.from(PostComment.class);
Join<PostComment, Post> post = postComment.join(PostComment_.post);
query.where(
builder.equal(
post.get(Post_.title),
"High-Performance Java Persistence"
)
);
List<PostComment> comments = entityManager
.createQuery(query)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
或者,假设我们想要在过滤Post
title
和PostDetails
createdOn
属性时获取 DTO 投影。
我们可以在创建连接属性时使用元模型,以及在构建 DTO 投影列别名或引用我们需要过滤的实体属性时:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
Root<PostComment> postComment = query.from(PostComment.class);
Join<PostComment, Post> post = postComment.join(PostComment_.post);
query.multiselect(
postComment.get(PostComment_.id).alias(PostComment_.ID),
postComment.get(PostComment_.review).alias(PostComment_.REVIEW),
post.get(Post_.title).alias(Post_.TITLE)
);
query.where(
builder.and(
builder.like(
post.get(Post_.title),
"%Java Persistence%"
),
builder.equal(
post.get(Post_.details).get(PostDetails_.CREATED_BY),
"Vlad Mihalcea"
)
)
);
List<PostCommentSummary> comments = entityManager
.createQuery(query)
.unwrap(Query.class)
.setResultTransformer(Transformers.aliasToBean(PostCommentSummary.class))
.getResultList();
Run Code Online (Sandbox Code Playgroud)
酷,对吧?
对于eclipselink,只有以下依赖项足以生成元模型.不需要任何其他东西.
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
<version>2.5.1</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
对于 Hibernate 作为提供者,这是最常见的恕我直言:
对于像 Gradle、Maven 这样的构建工具,您需要在类路径和编译器级别>=1.6 中拥有 Hibernate JPA 2 Metamodel Generator jar,这就是您构建项目所需的全部内容,元模型将自动生成。
如果是 IDE Eclipse 1. 转到 Project->Properties->Java Compiler->Annotation Processing 并启用它。2. 展开Annotation Processing->Factory Path-> Add External Jar add Hibernate JPA 2 Metamodel Generator jar 勾选新添加的jar并说OK。清洁和构建完成!
链接来自 maven repo https://mvnrepository.com/artifact/org.hibernate/hibernate-jpamodelgen 的Hibernate JPA 2 Metamodel Generator jar 链接
归档时间: |
|
查看次数: |
95570 次 |
最近记录: |