যেহেতু এটি একটি খুব সাধারণ প্রশ্ন, আমি এই নিবন্ধটি লিখেছি , যার ভিত্তিতে এই উত্তরটি ভিত্তিক।
আসুন আমাদের অ্যাপ্লিকেশন নিম্নলিখিত ব্যবহার অনুমান Post
, PostComment
, PostDetails
, এবং Tag
সত্ত্বা, যা একের সাথে অধিকের গঠন একের সাথে এক, এবং অনেক সাথে অধিকের টেবিল সম্পর্ক :
জেপিএ ক্রিটারিয়া মেটামোডেল কীভাবে উত্পন্ন করা যায়
hibernate-jpamodelgen
হাইবারনেট ORM দ্বারা উপলব্ধ সরঞ্জাম প্রকল্পের সত্ত্বা স্ক্যান এবং JPA নির্ণায়ক Metamodel জেনারেট করতে ব্যবহার করা যাবে। আপনাকে যা করতে হবে তা হ'ল মাভেন কনফিগারেশন ফাইলের মধ্যে নিম্নলিখিতটি যুক্ত annotationProcessorPath
করতে হবে:maven-compiler-plugin
pom.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>
এখন, প্রকল্পটি সংকলিত হয়ে গেলে আপনি target
ফোল্ডারে দেখতে পাচ্ছেন যে নিম্নলিখিত জাভা ক্লাসগুলি তৈরি করা হয়েছে:
> tree target/generated-sources/
target/generated-sources/
└── annotations
└── com
└── vladmihalcea
└── book
└── hpjp
└── hibernate
├── forum
│ ├── PostComment_.java
│ ├── PostDetails_.java
│ ├── Post_.java
│ └── Tag_.java
ট্যাগ সত্তা মেটামোডেল
তাহলে Tag
সত্তা নিম্নরূপ ম্যাপ করা হয়:
@Entity
@Table(name = "tag")
public class Tag {
@Id
private Long id;
private String name;
}
Tag_
Metamodel বর্গ ভালো উত্পন্ন হয়:
@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";
}
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<>();
}
Post
সত্তা দুটি মৌলিক বৈশিষ্ট্য আছে, id
এবং title
, একটি একের সাথে অধিকের comments
সংগ্রহ, একটি এক-এক details
সমিতি, এবং একটি অনেক সাথে অধিকেরtags
সংগ্রহ।
Post_
Metamodel বর্গ নিম্নরূপ উত্পন্ন হয়:
@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";
}
বেসিক id
এবং title
বৈশিষ্ট্যগুলি পাশাপাশি ওয়ান-টু-ও- details
অ্যাসোসিয়েশন কিছু SingularAttribute
সময় দ্বারা উপস্থাপিত হয় comments
এবং tags
সংগ্রহগুলি জেপিএ দ্বারা প্রতিনিধিত্ব করা হয়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;
}
সমস্ত সত্তা বৈশিষ্ট্য SingularAttribute
সম্পর্কিত PostDetails_
মেটোমোডেল শ্রেণিতে জেপিএ দ্বারা প্রতিনিধিত্ব করতে চলেছে :
@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";
}
পোস্টকমেন্ট সত্তা মেটামোডেল
PostComment
নিম্নরূপ ম্যাপ করা হয়:
@Entity
@Table(name = "post_comment")
public class PostComment {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
private String review;
}
এবং, সমস্ত সত্তা বৈশিষ্ট্য SingularAttribute
সম্পর্কিত PostComments_
মেটোমোডেল শ্রেণিতে জেপিএ দ্বারা প্রতিনিধিত্ব করা হয় :
@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";
}
জেপিএ ক্রিটারিয়া মেটামোডেল ব্যবহার করে
জেপিএ মেটামোডেল ছাড়াই, PostComment
তাদের সম্পর্কিত Post
শিরোনাম দ্বারা ফিল্টার করা সত্তাগুলি আনতে হবে এমন একটি ক্রেতারিয়া এপিআই কোয়েরিটি দেখতে এই রকম হবে:
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();
লক্ষ্য করুন যে দৃষ্টান্তটি post
তৈরি করার সময় Join
আমরা title
স্ট্রিংকে আক্ষরিক ব্যবহার করেছি এবং রেফারেন্স দেওয়ার সময় স্ট্রিং আক্ষরিক ব্যবহার করেছি Post
title
।
জেপিএ মেটোমোডেল আমাদের হার্ড-কোডিং সত্তা বৈশিষ্ট্যগুলি এড়াতে দেয়, যেমন নীচের উদাহরণ দ্বারা চিত্রিত:
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();
আপনি কোডোটার মতো কোনও কোড সমাপ্তির সরঞ্জাম ব্যবহার করছেন যদি জেপিএ ক্রিটারিয়া এপিআই ক্যোরিয়াসগুলি লেখা অনেক সহজ। পরীক্ষা করে দেখুন এই নিবন্ধটি Codota আইডিই প্লাগইন সম্পর্কে আরো বিস্তারিত জানার জন্য।
অথবা, ধরুন আমরা একটি আনতে চান DTO অভিক্ষেপ যখন ফিল্টারিং Post
title
এবংPostDetails
createdOn
বৈশিষ্ট্যগুলি ।
যোগদানের বৈশিষ্ট্যগুলি তৈরি করার সময়, পাশাপাশি ডিটিও প্রজেকশন কলাম এলিয়াসগুলি তৈরি করার সময় বা আমাদের ফিল্টার করার জন্য সত্তা বৈশিষ্ট্যগুলি উল্লেখ করার সময় আমরা মেটামোডেল ব্যবহার করতে পারি:
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();
ঠিক আছে তো?