JPA (Java Persistence API) সাধারণত ডেটাবেসের সাথে অবজেক্ট-রিলেশনাল ম্যাপিংয়ের জন্য ব্যবহৃত হয়, তবে JPA এর Entity ক্লাসে custom validation rules তৈরি করা যায়। Java Bean Validation API (JSR 303/JSR 380) JPA এর সাথে একত্রিতভাবে কাজ করতে পারে, যেখানে Constraint annotations এবং Validator classes ব্যবহার করে Entity ক্লাসের ক্ষেত্রগুলোর জন্য কাস্টম ভ্যালিডেশন তৈরি করা যায়।
JPA-তে custom validation rules তৈরি করার জন্য Java Bean Validation API (javax.validation) ব্যবহার করা হয়। এখানে আমরা @Constraint, @Valid, এবং @Validator অ্যানোটেশনসহ কাস্টম ভ্যালিডেশন রুলস তৈরি করতে পারি।
1. Custom Validation Annotation তৈরি করা
কাস্টম ভ্যালিডেশন রুলস তৈরি করতে প্রথমে একটি কাস্টম অ্যানোটেশন তৈরি করতে হবে, যা Entity ক্লাসে প্রয়োগ করা যাবে।
Custom Annotation:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = CustomEmailValidator.class) // Specify the validator class
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEmail {
String message() default "Invalid email format"; // Default error message
Class<?>[] groups() default {}; // Grouping of validation constraints
Class<? extends Payload>[] payload() default {}; // Additional data about the constraint
}
এখানে:
@Constraint(validatedBy = CustomEmailValidator.class)দ্বারাCustomEmailValidatorক্লাসটিকে ভ্যালিডেটর হিসেবে চিহ্নিত করা হয়েছে।message(): যখন ভ্যালিডেশন ব্যর্থ হবে, তখন প্রদর্শিত হবে এমন একটি ডিফল্ট মেসেজ।groups()এবংpayload(): এগুলি অতিরিক্ত কাস্টম ভ্যালিডেশন কনফিগারেশন।
2. Custom Validator Class তৈরি করা
একবার অ্যানোটেশন তৈরি হয়ে গেলে, এবার একটি কাস্টম ভ্যালিডেটর ক্লাস তৈরি করতে হবে যা বাস্তবে ভ্যালিডেশন লজিকটি বাস্তবায়ন করবে।
Custom Validator Class:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CustomEmailValidator implements ConstraintValidator<ValidEmail, String> {
@Override
public void initialize(ValidEmail constraintAnnotation) {
// Initialization logic, if needed
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// Simple regex for validating email format
if (value == null) {
return true; // Let @NotNull handle the null check
}
// Regex to validate email format
String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
return value.matches(emailRegex);
}
}
এখানে:
ConstraintValidator<ValidEmail, String>: এই ক্লাসValidEmailঅ্যানোটেশনের সাথে যুক্ত করা হয়েছে এবংStringটাইপের ফিল্ডে ভ্যালিডেশন প্রয়োগ করা হবে।isValid()মেথডে ডেটা যাচাই করা হয়। এখানে আমরা একটি সিম্পল রেগুলার এক্সপ্রেশন ব্যবহার করেছি ইমেইল ফরম্যাট চেক করার জন্য।initialize()মেথডটি ইনিশিয়ালাইজেশন লজিকের জন্য ব্যবহৃত হয়, তবে এখানে কোনো অতিরিক্ত লজিক নেই।
3. Custom Validation Annotation Entity Class এ প্রয়োগ করা
এখন আমরা কাস্টম ভ্যালিডেশন অ্যানোটেশনটি আমাদের Entity ক্লাসে প্রয়োগ করতে পারি।
Entity Class (User):
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull(message = "Name cannot be null")
private String name;
@ValidEmail
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এখানে:
@ValidEmail: কাস্টম ভ্যালিডেশন অ্যানোটেশনemailফিল্ডে প্রয়োগ করা হয়েছে, যাতে এটি নিশ্চিত করা যায় যে ইমেইল ঠিক ফরম্যাটে রয়েছে।@NotNull: এটি ডিফল্ট Java Bean Validation API থেকে এসেছে এবংnameফিল্ডে প্রয়োগ করা হয়েছে, যা নিশ্চিত করে যে নাম ফিল্ড নাল নয়।
4. Validation ব্যবহার করা
JPA Entity ক্লাসে কাস্টম ভ্যালিডেশন প্রয়োগ করার পর, আপনি Validator ক্লাস বা EntityManager এর মাধ্যমে ভ্যালিডেশন কার্যকর করতে পারবেন।
Validation Example:
import javax.validation.*;
import java.util.Set;
public class UserService {
private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
private static Validator validator = factory.getValidator();
public void createUser(User user) {
Set<ConstraintViolation<User>> violations = validator.validate(user);
if (!violations.isEmpty()) {
for (ConstraintViolation<User> violation : violations) {
System.out.println(violation.getMessage());
}
} else {
// Proceed with saving the user if validation passes
System.out.println("User is valid. Proceeding with save.");
}
}
}
এখানে:
Validatorক্লাস ব্যবহার করেuserঅবজেক্টের উপর ভ্যালিডেশন চালানো হচ্ছে।- যদি কোনো ভ্যালিডেশন ব্যর্থ হয়, তবে constraint violations এর মেসেজগুলো কনসোলে প্রিন্ট হবে।
validator.validate(user)মেথডটি সকল ভ্যালিডেশন চেক করবে এবং যদি কোনো ত্রুটি পাওয়া যায়, সেটি ফিরিয়ে দেবে।
সারাংশ
JPA-তে custom validation rules তৈরি করতে Java Bean Validation API ব্যবহার করা হয়, যা @Constraint এবং @Validator ক্লাসের মাধ্যমে কাস্টম ভ্যালিডেশন অ্যানোটেশন তৈরি এবং প্রয়োগ করতে সক্ষম করে। কাস্টম ভ্যালিডেশন অ্যানোটেশন তৈরির মাধ্যমে আপনি জটিল ডেটা যাচাই, যেমন ইমেইল ফরম্যাট যাচাই বা কাস্টম লজিক প্রয়োগ করতে পারেন। @ValidEmail এর মত কাস্টম অ্যানোটেশন এবং ConstraintValidator ক্লাস দিয়ে JPA Entity ক্লাসের ক্ষেত্রে নিরাপত্তা এবং ডেটার বৈধতা নিশ্চিত করা যায়।
Read more