Spring Framework, Java tabanlı bir uygulama çerçevesi olup, pek çok farklı anatasyonu içerir. Bu anatasyonlar, genellikle Spring çerçevesinde uygulamanın davranışını ve işlevlerini düzenlemek için kullanılır. İşte bazı örnekler:
@Component: Sınıfları Spring bean'leri olarak işaretlemek için kullanılır. Spring çerçevesi, bu anatasyonu bulduğunda, belirtilen sınıfın bir örneğini oluşturur ve bunu Spring uygulama bağlamında bir bean olarak kaydeder.
@Component
public class ExampleClass { }
@Autowired: Bağımlılık enjeksiyonu için kullanılır. Bu anatasyon sayesinde, bir Spring bean'i başka bir Spring bean'ine enjekte edebiliriz. Spring, @Autowired anatasyonu bulduğunda, ilgili türde bir bean'i arar ve enjekte eder.
public class ExampleClass {
@Autowired
private AnotherExampleClass anotherExampleClass;
}
@Service: İş katmanının bir parçası olan hizmet sınıflarını tanımlamak için kullanılır. @Service anatasyonu, genellikle işlevsel süreçleri uygulayan sınıflar üzerinde kullanılır ve @Component anatasyonuna benzer şekilde, Spring çerçevesi tarafından yönetilir.
@Service
public class ExampleService { }
@Repository: Veritabanı işlemlerini gerçekleştiren DAO (Data Access Object) sınıflarını tanımlamak için kullanılır. Bu anatasyon, Spring veritabanı işlemleri sırasında oluşan hataları Spring DataAccessException türüne çevirir.
@Repository
public class ExampleRepository { }
@Controller: Spring MVC'de, bir HTTP isteğinin nasıl işleneceğini belirlemek için kullanılır. @Controller anatasyonu ile işaretlenmiş bir sınıf, genellikle bir web isteğine yanıt verir.
@Controller
public class ExampleController { }
@RequestMapping: İsteklerin hangi metot tarafından işleneceğini belirtmek için kullanılır. Hem sınıf seviyesinde hem de metot seviyesinde kullanılabilir.
@Controller
@RequestMapping("/home")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@PathVariable: Bir HTTP isteği sırasında bir URL parçasını dinamik olarak çekmek için kullanılır.
@RequestMapping("/users/{userId}")
public String getUser(@PathVariable("userId") int userId) {
// code here
}
@ResponseBody: Metodun döndürdüğü değerin, yanıt gövdesi olarak kullanılacağını belirtir.
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, World!";
}
9. **@Qualifier**: Spring konteyneri içerisinde birden fazla bean aynı türde olduğunda, hangi bean'in `@Autowired` anatasyonu ile enjekte edileceğini belirtmek için kullanılır.
@Autowired
@Qualifier("specificBeanName")
private ExampleClass exampleClass;
@Value: Statik veya dinamik olarak tanımlanmış bir değeri bir alan ya da parametreye enjekte etmek için kullanılır.
@Value("${property.name}")
private String propertyName;
@RestController: @Controller ve @ResponseBody anatasyonlarının birleşimidir. Bir HTTP isteğine yanıt veren ve yanıt gövdesini doğrudan oluşturan bir sınıfı tanımlar.
@RestController
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@Transactional: Spring tarafından sağlanan bildirimsel işlem yönetimini etkinleştirmek için kullanılır. Bu anatasyon, genellikle bir işlem sınırını tanımlamak için hizmet sınıflarının metotlarına uygulanır.
@Transactional
public void performTransaction() {
// transactional operations
}
@Configuration: Bir sınıfı bir Spring Konfigürasyon Sınıfı olarak tanımlar. @Bean anatasyonunu kullanarak bean tanımlamalarının bulunabileceği yerleri belirtir.
@Configuration
public class AppConfig {
@Bean
public ExampleBean exampleBean() {
return new ExampleBean();
}
}
@Bean: Metotları bir Spring Bean'i oluşturmak için kullanılır. Bu metotlar, @Configuration anatasyonu ile işaretlenmiş bir sınıf içinde bulunmalıdır.
@Configuration
public class AppConfig {
@Bean
public ExampleBean exampleBean() {
return new ExampleBean();
}
}
@Scope: Bir Spring Bean'in kapsamını belirler. Örneğin, "singleton" (varsayılan), "prototype", "request", "session" ve "globalSession" gibi.
@Bean
@Scope("prototype")
public ExampleBean exampleBean() {
return new ExampleBean();
}
@RequestParam: HTTP isteğinden bir parametreyi çıkarmak için kullanılır.
@RequestMapping("/user")
public String getUser(@RequestParam("id") int id) {
// code here
}
@RequestBody: HTTP isteğinin gövdesini bir nesneye bağlamak için kullanılır.
@PostMapping("/user")
public String createUser(@RequestBody User user) {
// code here
}
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: İlgili HTTP metodu için belirli bir isteği işlemek için kullanılır. Örneğin, @GetMapping bir GET isteği için, @PostMapping bir POST isteği için kullanılır ve benzeri.
@GetMapping("/user")
public String getUser() {
// code here
}
@PostMapping("/user")
public String createUser() {
// code here
}
@ComponentScan: Spring'e belirli bir paketi veya paketleri tarayarak Spring Bean'leri bulmasını söyler.
java
Copy code
@Configuration
@ComponentScan(basePackages = "com.example.package")
public class AppConfig { }
@EnableAutoConfiguration: Spring Boot'ta, Spring'in bazı varsayılan davranışları otomatik olarak yapılandırmasını sağlar. Örneğin, classpath'teki belirli kitaplıklara dayalı olarak otomatik yapılandırma özelliklerini etkinleştirebilir.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Not: @SpringBootApplication anatasyonu, @Configuration, @EnableAutoConfiguration ve @ComponentScan anatasyonlarını bir arada kullanır.
@Import: Bir veya daha fazla @Configuration sınıfını mevcut konfigürasyona dahil eder. Bu, mevcut Spring uygulamasına ek yapılandırmalar eklemek için kullanılır.
@Configuration
@Import(AnotherConfig.class)
public class AppConfig { }
@Profile: Bir bean'in veya yapılandırmanın belirli bir profil altında aktif olmasını sağlar. Bu, çeşitli çevreler (örneğin, development, testing, production) için farklı yapılandırmalar sağlamak amacıyla kullanılır.
@Configuration
@Profile("development")
public class DevConfig { }
@PropertySource: Bir özellik dosyasının yolunu belirtir. Spring, belirtilen dosyadaki özellikleri yükler ve bu özellikler uygulama bağlamında kullanılabilir hale gelir.
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig { }
@Lazy: Bir bean'in sadece ilk talepte oluşturulmasını sağlar. Bu, başlangıçta gerekmeyen ancak sonraki kullanımlar için gerekebilecek olan ağır başlangıç maliyetine sahip bean'ler için kullanışlıdır.
@Bean
@Lazy
public ExampleBean exampleBean() {
return new ExampleBean();
}
Evet, Spring Framework'deki anatasyonlara daha fazla derinlemesine bakalım:
@ExceptionHandler: Bir yöntemi belirli bir istisnayı işlemek için kullanılır. Bu anatasyon genellikle bir @Controller veya @RestController sınıfında kullanılır ve belirli bir istisna türünün bir metotta işlenmesini sağlar.
@Controller
public class ExampleController {
// ...
@ExceptionHandler(Exception.class)
public ModelAndView handleError(HttpServletRequest req, Exception ex) {
// handle the exception
}
}
@ResponseStatus: HTTP durum kodunu bir metoda veya istisna sınıfına bağlar. HTTP yanıt durumunu özelleştirmenin kolay bir yolunu sağlar.
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")
public class OrderNotFoundException extends RuntimeException {
// ...
}
@EnableAspectJAutoProxy: Spring AOP özelliklerini etkinleştirmek için kullanılır. Spring, AspectJ tarzı anatasyonları kullanarak yönlendirme özelliklerini destekler.
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
// ...
}
@Before, @After, @Around, @AfterReturning, @AfterThrowing: Spring AOP'de bir Aspect'in özel bölümlerini işaretlemek için kullanılır.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.*.*(..))")
public void logBeforeAllMethods() { ... }
@After("execution(* com.example.service.*.*(..))")
public void logAfterServiceMethods() { ... }
// ...
}
@EnableTransactionManagement: Spring'deki bildirimsel işlem yönetimini etkinleştirir. Spring, platform işlem yönetimini ve işlem demarcation'ını işlem API'sini kullanarak geniş bir şekilde destekler.
@Configuration
@EnableTransactionManagement
public class AppConfig {
// ...
}
@EnableScheduling: Spring'deki zamanlanmış görevlerin etkinleştirilmesini sağlar. Spring, cron tarzı görevler, tekrarlanan görevler ve belirli bir gecikme ile başlatılan görevler gibi farklı türdeki görevleri destekler.
@Configuration
@EnableScheduling
public class AppConfig {
// ...
}
@Scheduled: Bir metodu belirli bir zaman aralığında çalıştırılacak şekilde işaretler.
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000)
public void doSomething() {
// this will be executed every 5 seconds
}
}
@Order: Bean'lerin veya anatasyonlarla işaretlenmiş yöntemlerin uygulanma sırasını kontrol eder.
@Component
@Order(1)
public class FirstBean {
//...
}
@PreAuthorize, @PostAuthorize, @Secured: Spring Security kütüphanesinde kullanılan anatasyonlardır. Belirli bir işlemi gerçekleştirecek kullanıcının yetkilendirme durumunu kontrol etmek için kullanılırlar.
@PreAuthorize("hasRole('ADMIN')")
public void adminTask() { /* code here */ }
@EnableWebMvc: Spring MVC'yi etkinleştirir. Bu anatasyon genellikle bir konfigürasyon sınıfı ile birlikte kullanılır.
@Configuration
@EnableWebMvc
public class WebConfig { /* code here */ }
@SessionAttributes: Model içerisine eklenen belirli özelliklerin oturumda tutulmasını sağlar. Genellikle bir controller sınıfında kullanılır.
@Controller
@SessionAttributes("attributeName")
public class ExampleController { /* code here */ }
@Async: Bir metodun asenkron bir işlem olarak çalıştırılmasını sağlar. Spring, @Async anatasyonu ile işaretlenmiş bir metodun ayrı bir iş parçacığından çalıştırılmasını sağlar.
@Async
public void asyncMethod() { /* code here */ }
@EnableAsync: Spring'deki asenkron işlemleri etkinleştirir. Genellikle bir konfigürasyon sınıfı ile birlikte kullanılır.
@Configuration
@EnableAsync
public class AppConfig { /* code here */ }
@JmsListener: Bir metodu bir JMS mesaj dinleyicisi olarak işaretler. Spring JMS, Java'nın Mesajlaşma Hizmetini Spring uygulamalarında kullanmayı kolaylaştırır.
@JmsListener(destination = "mailbox", containerFactory = "myFactory")
public void receiveMessage(Email email) { /* code here */ }
@EnableJms: Spring JMS konfigürasyonunu etkinleştirir. Genellikle bir konfigürasyon sınıfı ile birlikte kullanılır.
@Configuration
@EnableJms
public class AppConfig { /* code here */ }
@JsonView: Jackson kitaplığı tarafından kullanılan bir anatasyon. Bir model sınıfının hangi özelliklerinin JSON olarak serileştirileceğini belirtmek için kullanılır.
public class Example {
@JsonView(Views.Public.class)
public String publicAttribute;
@JsonView(Views.Internal.class)
public String internalAttribute;
}
@EnableCaching: Spring uygulamasında caching özelliklerini etkinleştirir.
java
Copy code
@Configuration
@EnableCaching
public class AppConfig { }
@Cacheable: Bir metodu caching için işaretler. Bu anatasyon ile işaretlenmiş bir metot çalıştırıldığında, sonuçları cache'e eklenir ve aynı girdilere sahip gelecek çağrılar için sonuç cache'den getirilir.
@Cacheable("books")
public Book findBook(ISBN isbn) {...}
@CacheEvict: Cache'den bir girdiyi silmek için kullanılır. Genellikle bir veriyi güncelledikten veya sildikten sonra cache'i güncellemek için kullanılır.
@CacheEvict(value = "books", key = "#isbn")
public void updateBook(ISBN isbn, BookDescriptor descriptor) {...}
@Primary: Birden fazla bean aynı türde olduğunda ve Spring hangisini enjekte etmesi gerektiğini belirleyemezse, @Primary anatasyonu kullanılabilir. @Primary anatasyonu ile işaretlenmiş olan bean tercih edilir.
@Bean
@Primary
public MyBean myBean() {...}
@ControllerAdvice: Global hata işlemcisi veya global @InitBinder gibi özellikleri bir controller'a eklemek için kullanılır. Bu anatasyon genellikle global exception handler'lar için kullanılır.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {Exception.class})
public ResponseEntity<Object> handleAnyException(Exception e) {...}
}
@PathVariable: Bir URL'deki değişken bir değeri bir metot parametresine bağlar.
@GetMapping("/books/{isbn}")
public Book getBook(@PathVariable("isbn") String isbn) {...}
@EnableRetry: Spring uygulamasında yeniden deneme mekanizmasını etkinleştirir.
@Configuration
@EnableRetry
public class AppConfig { }
@Retryable: Bir metot çağrısının belirli bir istisna durumunda yeniden deneneceğini belirtir.
@Retryable(value = {ServiceUnavailableException.class}, maxAttempts = 3)
public void retryableService() {...}
@Recover: Belirli bir istisna durumunda bir yeniden deneme operasyonunun başarısız olmasının ardından geri almak için kullanılır.
@Recover
public void recover(ServiceUnavailableException e) {...}
@CrossOrigin: Bir controller veya handler metotları üzerinde CORS (Cross-Origin Resource Sharing) davranışını yapılandırmak için kullanılır.
@CrossOrigin(origins = "http://example.com")
@GetMapping("/hello")
public String hello() {...}
@RequestBody: HTTP isteğinin body'sinde bulunan değerlerin bir nesneye otomatik olarak bağlanmasını sağlar.
@PostMapping("/books")
public void addBook(@RequestBody Book book) {...}
@ResponseBody: Bir metodun dönüş değerinin HTTP yanıtının body'si olacağını belirtir.
@GetMapping("/books/{id}")
@ResponseBody
public Book getBook(@PathVariable Long id) {...}
@ResponseEntity: HTTP yanıtını tamamen kontrol etmek için kullanılır. HTTP durum kodu, header'lar ve body'yi özelleştirebiliriz.
@GetMapping("/books/{id}")
public ResponseEntity<Book> getBook(@PathVariable Long id) {
...
return new ResponseEntity<>(book, HttpStatus.OK);
}
@RequestMapping: Bir metodun bir HTTP isteğiyle nasıl eşleştirileceğini belirtir. HTTP metodu, yol, parametreler, header'lar ve medya türleri üzerinde eşleştirme yapabilir.
@RequestMapping(value = "/books/{id}", method = RequestMethod.GET, produces = "application/json")
public Book getBook(@PathVariable Long id) {...}
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: @RequestMapping anatasyonunun daha özelleştirilmiş sürümleridir. Sırasıyla GET, POST, PUT, DELETE ve PATCH HTTP metotlarıyla eşleştirirler.
@GetMapping("/books/{id}")
public Book getBook(@PathVariable Long id) {...}
@RequestParam: HTTP isteğindeki bir query parametresini bir metot parametresine bağlar.
@GetMapping("/books")
public List<Book> getBooks(@RequestParam(name = "author", required = false) String author) {...}
@RequestHeader: HTTP isteğindeki bir header'ı bir metot parametresine bağlar.
@GetMapping("/books/{id}")
public Book getBook(@RequestHeader("Authorization") String token, @PathVariable Long id) {...}
@CookieValue: Bir HTTP cookie değerini bir metot parametresine bağlar.
@GetMapping("/books/{id}")
public Book getBook(@CookieValue("sessionId") String sessionId, @PathVariable Long id) {...}
@SessionAttribute: Oturumda saklanan bir özelliği bir metot parametresine bağlar.
@GetMapping("/books/{id}")
public Book getBook(@SessionAttribute("user") User user, @PathVariable Long id) {...}
@ModelAttribute: Modelden bir özelliği bir metot parametresine bağlar, ya da bir model özelliğini bir nesne ile doldurur.
@GetMapping("/books/{id}")
public String getBook(@ModelAttribute("user") User user, @PathVariable Long id, Model model) {
Book book = findBook(id);
model.addAttribute("book", book);
return "book";
}
@Profile: Belirli bir Spring profili altında bir bean'in ya da configuration'ın aktif olmasını belirtir.
@Configuration
@Profile("development")
public class DevConfig { }
@Import: Bir başka configuration sınıfını içeri almak için kullanılır. Bu, genellikle bir configuration'ın bir başkasını genişletmesi gerektiğinde kullanılır.
@Configuration
@Import(AnotherConfig.class)
public class AppConfig { }
@ImportResource: XML konfigürasyon dosyalarını içeri almak için kullanılır. Bu, genellikle mevcut XML tabanlı bir konfigürasyonu yeni Java tabanlı bir konfigürasyonla birleştirmeniz gerektiğinde kullanılır.
@Configuration
@ImportResource("classpath:/com/myco/app-config.xml")
public class AppConfig { }
@Value: Bir property'nin değerini bir field veya metod parametresine enjekte etmek için kullanılır.
@Component
public class MyComponent {
@Value("${property.name}")
private String propertyName;
}
@Lazy: Bir bean'in lazy initialization'ı için kullanılır. Bu, Spring context'in başlangıcında bean'in oluşturulmasını engeller ve bean ilk kez talep edildiğinde oluşturulur.
@Component
@Lazy
public class LazyBean { }
@Controller, @RestController, @Service, @Repository, @Component: Bu anatasyonlar Spring'in bileşen tarama özelliklerini kullanarak bean'leri otomatik olarak tanımlamak için kullanılır.
@Controller
public class MyController { }
@Service
public class MyService { }
@Repository
public class MyRepository { }
@Component
public class MyComponent { }
@EnableGlobalMethodSecurity: Metod seviyesinde güvenlik anatasyonlarını etkinleştirir. Bu, genellikle @PreAuthorize veya @PostAuthorize gibi anatasyonları etkinleştirmek için kullanılır.
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter { }
@SpringBootApplication: Spring Boot uygulamasının başlangıç noktasını işaretler. Bu anatasyon genellikle ana sınıfın üzerinde bulunur ve @Configuration, @EnableAutoConfiguration ve @ComponentScan anatasyonlarını içerir.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@ExceptionHandler: Bir controller içinde bir exception'ı işlemek için kullanılır. Controller'da herhangi bir metot tarafından atılan exception'ı yakalar ve işler.
@Controller
public class MyController {
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
return "error";
}
}
@EnableTransactionManagement: Spring'in açıklamaya dayalı işlem yönetimini etkinleştirir. Genellikle bir konfigürasyon sınıfında kullanılır.
@Configuration
@EnableTransactionManagement
public class AppConfig { }
@Transactional: Bir metot çağrısının bir veritabanı işlemi içinde gerçekleşmesi gerektiğini belirtir.
@Service
public class MyService {
@Transactional
public void doSomeDataOperation() { }
}
@EnableScheduling: Spring'in scheduled task işlemlerini etkinleştirir. Genellikle bir konfigürasyon sınıfında kullanılır.
@Configuration
@EnableScheduling
public class AppConfig { }
@Scheduled: Bir metodu belirli bir zaman aralığında ya da belirli bir saatte çalıştırılacak bir görev olarak işaretler.
@Component
public class MyTask {
@Scheduled(fixedRate = 1000)
public void doSomething() { }
}
@EnableAspectJAutoProxy: Spring uygulamasında AspectJ otomatik proxy oluşturmayı etkinleştirir.
@Configuration
@EnableAspectJAutoProxy
public class AppConfig { }
@Aspect, @Pointcut, @Before, @After, @Around, @AfterReturning, @AfterThrowing: Spring AOP (Aspect-Oriented Programming) kütüphanesinde kullanılan anatasyonlardır. AOP, çapraz kesitli endişeleri (logging, caching, transaction management vb.) yönetmek için kullanılır.
@Aspect
public class LoggingAspect {
@Pointcut("execution(* com.myapp.service.*.*(..))")
public void serviceMethods() { }
@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) { }
}
@WebMvcTest: Spring Boot uygulamasında bir controller'ın slice testini gerçekleştirmek için kullanılır.
@WebMvcTest(MyController.class)
public class MyControllerTest { }
@DataJpaTest: Spring Boot uygulamasında bir repository'nin slice testini gerçekleştirmek için kullanılır.
@DataJpaTest
public class MyRepositoryTest { }
@RestClientTest: Spring Boot uygulamasında bir REST istemcisini test etmek için kullanılır.
@RestClientTest(MyRestClient.class)
public class MyRestClientTest { }
@MockBean: Spring Boot testlerinde bir bean'i mock etmek için kullanılır.
@SpringBootTest
public class MyServiceTest {
@MockBean
private MyDependency mockDependency;
}
@EnableJpaRepositories: Spring Data JPA repository tanımlarını konfigüre etmek ve etkinleştirmek için kullanılır.
@Configuration
@EnableJpaRepositories(basePackages = "com.example.myapp.repository")
public class AppConfig {}
@EntityScan: Spring Data JPA entity sınıflarını taramak için kullanılır.
@Configuration
@EntityScan(basePackages = "com.example.myapp.model")
public class AppConfig {}
@Table: Bir entity sınıfının hangi veritabanı tablosu ile ilişkili olduğunu belirtir.
@Entity
@Table(name = "books")
public class Book {...}
@Column: Bir entity sınıfındaki bir field'ın hangi veritabanı sütunu ile ilişkili olduğunu belirtir.
@Entity
public class Book {
@Column(name = "title")
private String title;
}
@Id: Bir entity sınıfındaki bir field'ın primary key olduğunu belirtir.
@Entity
public class Book {
@Id
private Long id;
}
@GeneratedValue: Bir entity sınıfındaki bir field'ın nasıl otomatik olarak oluşturulacağını belirtir.
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
@EnableJpaAuditing: JPA auditing özelliklerini etkinleştirmek için kullanılır.
@Configuration
@EnableJpaAuditing
public class AppConfig {}
@CreatedDate, @CreatedBy, @LastModifiedDate, @LastModifiedBy: Bu anatasyonlar, entity sınıflarındaki field'larda audit bilgilerinin otomatik olarak doldurulmasını sağlar.
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Book {
@CreatedDate
private LocalDateTime createdDate;
@CreatedBy
private String createdBy;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
@LastModifiedBy
private String lastModifiedBy;
}
@Version: Bir entity sınıfındaki bir field'ın, entity'nin her güncellenmesiyle otomatik olarak artırılacağını belirtir. Bu, genellikle optimistic locking stratejilerinde kullanılır.
@Entity
public class Book {
@Version
private Long version;
}
@Query: Bir repository metodu için custom bir sorgu tanımlar.
public interface BookRepository extends JpaRepository<Book, Long> {
@Query("SELECT b FROM Book b WHERE b.title = :title")
List<Book> findByTitle(@Param("title") String title);
}
Bu anatasyonlar, Spring ve Spring Data JPA uygulamalarını yapılandırma ve kontrol etmek için kullanılır ve her biri belirli bir amaca hizmet eder.
@PrePersist, @PreRemove, @PostPersist, @PostRemove, @PreUpdate, @PostUpdate, @PostLoad: Bu anatasyonlar, JPA entity lifecycle event'leri üzerinde callback metotlarını belirtmek için kullanılır.
@Entity
public class Book {
@PrePersist
public void prePersist() {...}
@PostPersist
public void postPersist() {...}
}
@JoinColumn: İki entity arasındaki ilişkiyi belirtirken kullanılır. Bir tablodaki foreign key sütununu belirtir.
@Entity
public class Book {
@ManyToOne
@JoinColumn(name = "author_id")
private Author author;
}
@OneToMany, @ManyToOne, @OneToOne, @ManyToMany: Entity'ler arasındaki ilişkileri belirtir.
@Entity
public class Book {
@ManyToOne
private Author author;
}
@Entity
public class Author {
@OneToMany(mappedBy = "author")
private List<Book> books;
}
@OrderBy: Bir collection tipindeki bir field'ın sıralanmasını belirtir.
@Entity
public class Author {
@OneToMany
@OrderBy("title")
private List<Book> books;
}
@Embedded, @Embeddable: Bir sınıfın bir başka sınıf içinde gömülü olarak kullanılacağını belirtir. @Embeddable anatasyonu gömülü sınıfa, @Embedded anatasyonu ise host sınıftaki field'a uygulanır.
@Embeddable
public class Address {...}
@Entity
public class Author {
@Embedded
private Address address;
}
@AttributeOverride, @AttributeOverrides: @Embedded anatasyonu ile gömülü bir sınıfın field'larının isimlerini override etmek için kullanılır.
@Entity
public class Author {
@Embedded
@AttributeOverride(name = "street", column = @Column(name = "home_street"))
private Address homeAddress;
}
@Transactional(readOnly = true): İşlem boyunca veritabanı üzerinde herhangi bir değişiklik yapılmasını önler.
@Service
public class BookService {
@Transactional(readOnly = true)
public Book findBook(Long id) {...}
}
@EntityGraph: JPA entity'lerinin fetch türünü değiştirmek için kullanılır.
public interface BookRepository extends JpaRepository<Book, Long> {
@EntityGraph(attributePaths = {"author"})
List<Book> findAll();
}
@DynamicUpdate: Bir entity sınıfının update sorgularında sadece değişen field'ların dikkate alınacağını belirtir.
@Entity
@DynamicUpdate
public class Book {...}
@MappedSuperclass: Bir sınıfın başka bir entity sınıfı tarafından miras alındığında field'larının da o entity sınıfı tarafından miras alınacağını belirtir.
@MappedSuperclass
public class BaseEntity {
@Id
@GeneratedValue
@Entity
Bu annotasyon, bir sınıfın bir veritabanı tablosuna karşılık geldiğini belirtmek için kullanılır.
Kullanım Senaryosu: Bir varlık sınıfının (Entity) veritabanında bir tabloya dönüştürülmesi.
java
Copy code
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
private Long id;
private String name;
// getters and setters
}
@Table
Bu annotasyon, varlık sınıfının veritabanındaki tablo adını belirtmek için kullanılır.
Kullanım Senaryosu: Varlık sınıfının tablo adını özelleştirmek.
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
@Entity
@Table(name = "tbl_customers")
public class Customer {
@Id
private Long id;
private String name;
// getters and setters
}
@Id
Bu annotasyon, bir varlık sınıfının benzersiz bir tanımlayıcısının olduğunu belirtmek için kullanılır.
Kullanım Senaryosu: Varlık sınıfının birincil anahtarını belirtmek.
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
private Long id;
private String name;
// getters and setters
}
@GeneratedValue
Bu annotasyon, bir varlık sınıfının benzersiz tanımlayıcısının nasıl otomatik olarak oluşturulacağını belirtmek için kullanılır.
Kullanım Senaryosu: Otomatik olarak artan (auto-increment) bir tanımlayıcıya sahip oluşturma işlemi.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
// getters and setters
}
@Column
Bu annotasyon, bir varlık sınıfındaki alanın veritabanındaki sütununun özelliklerini belirtmek için kullanılır.
Kullanım Senaryosu: Bir alanın veritabanı sütununu özelleştirmek.
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
private Long id;
@Column(name = "full_name", nullable = false, length = 50)
private String name;
// getters and setters
}
@OneToMany
Bu annotasyon, ilişkili varlık arasında bir "birçok" ilişkisini belirtmek için kullanılır. Bir varlık, diğer varlıkla birçok ilişkiye sahip olabilir.
Kullanım Senaryosu: Bir varlığın diğer varlıkla birçok ilişkisi bulunması.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
@Entity
public class Customer {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "customer")
private List<Order> orders;
// getters and setters
}
@ManyToOne
Bu annotasyon, ilişkili varlık arasında "çok bir" ilişkisini belirtmek için kullanılır. Bir varlık, diğer varlıkla tek bir ilişkiye sahip olabilir.
Kullanım Senaryosu: Bir varlığın diğer varlıkla tek bir ilişkisi bulunması.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Order {
@Id
private Long id;
private String orderNumber;
@ManyToOne
private Customer customer;
// getters and setters
}
@JoinColumn
Bu annotasyon, ilişkili sütunları birleştirmek için kullanılır. İki varlık arasındaki ilişkinin nasıl sağlandığını belirtir.
Kullanım Senaryosu: İki varlık arasındaki ilişkiyi tanımlamak ve birleştirmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.JoinColumn;
@Entity
public class Order {
@Id
private Long id;
private String orderNumber;
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
// getters and setters
}
@Transient
Bu annotasyon, bir alanın veritabanına dönüştürülmemesini belirtmek için kullanılır. Bu alanlar, veritabanında saklanmaz.
Kullanım Senaryosu: Bir alanın veritabanına dönüştürülmemesi gerektiği durumlar.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;
@Entity
public class Customer {
@Id
private Long id;
private String name;
@Transient
private int age;
// getters and setters
}
@Embedded
Bu annotasyon, bir varlık sınıfında başka bir gömülü varlık sınıfını temsil etmek için kullanılır.
Kullanım Senaryosu: Bir varlık sınıfında başka bir gömülü varlık kullanmak.
import javax.persistence.Embeddable;
@Embeddable
public class Address {
private String street;
private String city;
private String country;
// getters and setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Embedded;
@Entity
public class Customer {
@Id
private Long id;
private String name;
@Embedded
private Address address;
// getters and setters
}
@Enumerated
Bu annotasyon, bir alanın veritabanında nasıl temsil edileceğini belirtmek için kullanılır. Özellikle enum türlerinde kullanılır.
Kullanım Senaryosu: Bir enum alanının veritabanında nasıl temsil edileceğini belirtmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Enumerated;
public enum Gender {
MALE,
FEMALE
}
@Entity
public class Customer {
@Id
private Long id;
private String name;
@Enumerated
private Gender gender;
// getters and setters
}
@Temporal
Bu annotasyon, bir tarih veya zaman alanının veritabanında nasıl temsil edileceğini belirtmek için kullanılır.
Kullanım Senaryosu: Bir tarih veya zaman alanının veritabanında nasıl temsil edileceğini belirtmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import java.util.Date;
@Entity
public class Event {
@Id
private Long id;
private String name;
@Temporal(TemporalType.DATE)
private Date eventDate;
// getters and setters
}
@Lob
Bu annotasyon, bir alanın büyük nesne (LOB) verilerini temsil ettiğini belirtmek için kullanılır. Genellikle metin veya binary veriler için kullanılır.
Kullanım Senaryosu: Bir alanın büyük nesne (LOB) verilerini temsil etmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
@Entity
public class Document {
@Id
private Long id;
private String name;
@Lob
private byte[] content;
// getters and setters
}
@Version
Bu annotasyon, optimistic locking için bir alanı belirtmek için kullanılır. Bu alan, bir varlık nesnesinin değişikliklerinin yönetilmesinde sürüm kontrolü için kullanılır.
Kullanım Senaryosu: Optimistik kilit mekanizmasını kullanarak bir alanı sürüm kontrolü için belirtmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
@Entity
public class Product {
@Id
private Long id;
private String name;
@Version
private int version;
// getters and setters
}
@JoinTable
Bu annotasyon, bir ilişkideki birleştirme tablosunu belirtmek için kullanılır. İlişkili varlıklar arasındaki ilişkiyi yönetmek için bir ara tablo oluşturulur.
Kullanım Senaryosu: İlişkili varlıklar arasındaki birleştirme tablosunu belirtmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import java.util.List;
@Entity
public class Student {
@Id
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// getters and setters
}
@Formula
Bu annotasyon, veritabanı sütunlarını oluşturmak veya değerlerini hesaplamak için özel bir SQL formülü kullanmak için kullanılır.
Kullanım Senaryosu: Bir SQL formülüyle veritabanı sütununu oluşturmak veya değerini hesaplamak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Formula;
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
@Formula("price * 1.1")
private double priceWithTax;
// getters and setters
}
@Cascade
Bu annotasyon, bir ilişki üzerindeki otomatik kaydetme, güncelleme ve silme işlemlerinin nasıl yönetileceğini belirtmek için kullanılır.
Kullanım Senaryosu: Bir ilişkideki kaydetme, güncelleme ve silme işlemlerini yönetmek.
java
Copy code
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.CascadeType;
import javax.persistence.OneToMany;
import org.hibernate.annotations.Cascade;
@Entity
public class Customer {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "customer")
@Cascade(CascadeType.ALL)
private List<Order> orders;
// getters and setters
}
@NamedQuery
Bu annotasyon, adlandırılmış bir sorgu tanımlamak için kullanılır. Bu, daha karmaşık sorguları yönetmek ve yeniden kullanmak için kullanışlıdır.
Kullanım Senaryosu: Adlandırılmış bir sorgu tanımlamak ve kullanmak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Column;
import javax.persistence.Table;
@Entity
@Table(name = "tbl_customers")
@NamedQuery(name = "Customer.findByName", query = "SELECT c FROM Customer c WHERE c.name = :name")
public class Customer {
@Id
@Column(name = "customer_id")
private Long id;
private String name;
// getters and setters
}
@Cacheable
Bu annotasyon, bir varlığın önbelleğe alınması için kullanılır. Önbellekleme performansı artırabilir.
Kullanım Senaryosu: Bir varlığın önbelleğe alınması.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Cacheable;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
private Long id;
private String name;
// getters and setters
}
@SQLInsert
Bu annotasyon, özel bir SQL INSERT ifadesini belirtmek için kullanılır. Veritabanına yeni bir varlık eklerken özelleştirilmiş bir INSERT ifadesi kullanılmasını sağlar.
Kullanım Senaryosu: Özelleştirilmiş bir SQL INSERT ifadesi kullanarak veritabanına yeni bir varlık eklemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.SQLInsert;
@Entity
@SQLInsert(sql = "INSERT INTO customers (customer_id, customer_name) VALUES (?, ?)")
public class Customer {
@Id
private Long id;
private String name;
// getters and setters
}
@Where
Bu annotasyon, bir sorgu üzerinde bir filtre koşulu belirtmek için kullanılır. Belirtilen filtre koşuluna uyan varlıklar, sorgu sonuçlarında yer alır.
Kullanım Senaryosu: Bir sorgu üzerinde bir filtre koşulu belirlemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Where;
@Entity
@Where(clause = "active = true")
public class Product {
@Id
private Long id;
private String name;
private boolean active;
// getters and setters
}
@DiscriminatorColumn
Bu annotasyon, kalıtım hiyerarşisinde diskriminatör sütununun tanımlanması için kullanılır. Diskriminatör sütunu, alt sınıflar arasındaki farklılıkları belirtir.
Kullanım Senaryosu: Kalıtım hiyerarşisinde diskriminatör sütununun belirtilmesi.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.DiscriminatorColumn;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "product_type")
public abstract class Product {
@Id
private Long id;
private String name;
// getters and setters
}
@Entity
public class Book extends Product {
private String author;
// getters and setters
}
@SecondaryTable
Bu annotasyon, bir varlığın birden fazla tabloya sahip olduğunu belirtmek için kullanılır. İlgili alanlar, ek tabloda depolanır ve ilişkili verilerin doğru bir şekilde tutulmasını sağlar.
Kullanım Senaryosu: Bir varlığın birden fazla tabloya sahip olduğunu belirtmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.SecondaryTable;
@Entity
@SecondaryTable(name = "customer_details", pkJoinColumns = @PrimaryKeyJoinColumn(name = "customer_id"))
public class Customer {
@Id
private Long id;
private String name;
@Column(table = "customer_details")
private String email;
// getters and setters
}
@NamedNativeQuery
Bu annotasyon, adlandırılmış bir Native SQL sorgusu tanımlamak için kullanılır. Native SQL sorguları, özelleştirilmiş veritabanı sorgularını doğrudan kullanmanızı sağlar.
Kullanım Senaryosu: Adlandırılmış bir Native SQL sorgusu tanımlamak ve kullanmak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedNativeQuery;
import javax.persistence.Column;
import javax.persistence.Table;
@Entity
@Table(name = "tbl_customers")
@NamedNativeQuery(name = "Customer.findByCity", query = "SELECT * FROM tbl_customers WHERE city = :city", resultClass = Customer.class)
public class Customer {
@Id
@Column(name = "customer_id")
private Long id;
private String name;
private String city;
// getters and setters
}
Bu, Hibernate 5'te kullanılan diğer annotasyonlara örnek verilmiştir. Bu annotasyonlar, veritabanı işlemlerini daha fazla özelleştirmek, performansı artırmak ve doğrudan SQL sorguları kullanmak için kullanılır.
User
devam
ChatGPT
Tabii, işte devamı:
@MapKey
Bu annotasyon, bir Map koleksiyonunun anahtarının hangi varlık alanına eşleneceğini belirtmek için kullanılır.
Kullanım Senaryosu: Bir Map koleksiyonunun anahtarını belirlemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.MapKey;
import java.util.Map;
@Entity
public class Order {
@Id
private Long id;
private String customerName;
@OneToMany(mappedBy = "order")
@MapKey(name = "productCode")
private Map<String, OrderItem> items;
// getters and setters
}
@Index
Bu annotasyon, bir veritabanı indeksinin oluşturulmasını sağlar. İndeksler, veritabanı sorgularının performansını artırır.
Kullanım Senaryosu: Bir veritabanı indeksi oluşturmak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table;
@Entity
@Table(name = "tbl_products", indexes = {@Index(columnList = "category"), @Index(columnList = "price")})
public class Product {
@Id
private Long id;
private String name;
private String category;
private double price;
// getters and setters
}
@OnDelete
Bu annotasyon, bir ilişki üzerinde silme işlemi gerçekleştirildiğinde ne yapılacağını belirtmek için kullanılır. Örneğin, bir ana varlık silindiğinde ilişkili alt varlıkları da silmek için kullanılabilir.
Kullanım Senaryosu: İlişkili alt varlıkları silmek için bir silme işlemi gerçekleştirildiğinde.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import java.util.List;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
@OnDelete(action = OnDeleteAction.CASCADE)
private List<Employee> employees;
// getters and setters
}
@Any
Bu annotasyon, çeşitli varlık türleri arasında dinamik bir ilişki belirtmek için kullanılır. İlişkilendirilen varlığın türü çalışma zamanında belirlenir.
Kullanım Senaryosu: Dinamik ilişkileri yönetmek için kullanılır.
java
Copy code
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Any;
import javax.persistence.JoinColumn;
@Entity
public class Review {
@Id
private Long id;
private String content;
@ManyToOne
@JoinColumn(name = "item_id")
@Any(metaColumn = @Column(name = "item_type"))
private Item item;
// getters and setters
}
@Lob
Bu annotasyon, bir alanın büyük nesne (LOB) verilerini temsil ettiğini belirtmek için kullanılır. Büyük veriler, metin, görüntü, ses vb. gibi veri tiplerini içerebilir.
Kullanım Senaryosu: Büyük nesne verilerini temsil etmek için kullanılır.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
@Entity
public class Document {
@Id
private Long id;
private String name;
@Lob
private byte[] content;
// getters and setters
}
@AttributeOverride
Bu annotasyon, bir varlık sınıfında tanımlanan bir alanın, kalıtım yoluyla alınan bir üst sınıfta belirtilen bir alanı geçersiz kılmasını sağlar.
Kullanım Senaryosu: Kalıtım hiyerarşisinde bir alanın üst sınıfta belirtilen alanı geçersiz kılması.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
@Entity
@AttributeOverrides({
@AttributeOverride(name = "firstName", column = @Column(name = "customer_first_name")),
@AttributeOverride(name = "lastName", column = @Column(name = "customer_last_name"))
})
public class Customer extends Person {
@Id
private Long id;
// getters and setters
}
@NaturalId
Bu annotasyon, bir varlık alanının doğal bir kimlik (natural id) olarak işaretlendiğini belirtmek için kullanılır. Doğal kimlik, benzersiz bir değere sahip bir alanı temsil eder.
Kullanım Senaryosu: Bir varlık alanını doğal kimlik olarak işaretlemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.NaturalId;
@Entity
public class User {
@Id
private Long id;
@NaturalId
private String username;
// getters and setters
}
@Immutable
Bu annotasyon, bir varlığın değişmez (immutable) olduğunu belirtmek için kullanılır. Değişmez varlıklar, bir kez oluşturulduktan sonra durumlarının değiştirilemez olduğu anlamına gelir.
Kullanım Senaryosu: Bir varlığı değişmez olarak işaretlemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Immutable;
@Entity
@Immutable
public class Product {
@Id
private Long id;
private String name;
private double price;
// getters and setters
}
@BatchSize
Bu annotasyon, ilişkili bir koleksiyonun yüklenirken kaç varlık için bir sorgu yapılacağını belirtmek için kullanılır. Büyük koleksiyonların yüklenme performansını artırmak için kullanışlıdır.
Kullanım Senaryosu: İlişkili bir koleksiyonun yüklenme performansını artırmak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import org.hibernate.annotations.BatchSize;
import java.util.List;
@Entity
public class Order {
@Id
private Long id;
private String customerName;
@OneToMany(mappedBy = "order")
@BatchSize(size = 20)
private List<OrderItem> items;
// getters and setters
}
@LazyGroup
Bu annotasyon, ilişkili bir varlığın belirli ilişki gruplarının tembel yüklenmesini sağlamak için kullanılır. Bu sayede ilişkili varlıklar sadece ihtiyaç duyulduğunda yüklenir, performansı artırır.
Kullanım Senaryosu: İlişkili varlıkların tembel yüklenmesini belirli ilişki gruplarına göre sağlamak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.LazyGroup;
@Entity
public class OrderItem {
@Id
private Long id;
private String productName;
@ManyToOne
@LazyGroup("basic")
private Order order;
// getters and setters
}
@Filter
Bu annotasyon, bir filtreleme kuralı tanımlamak ve uygulamak için kullanılır. Filtreleme kuralları, sorguları veya ilişkili verileri belirli kriterlere göre sınırlamak için kullanılabilir.
Kullanım Senaryosu: Filtreleme kurallarını tanımlamak ve uygulamak.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
@Entity
@FilterDef(name = "activeProducts", parameters = @ParamDef(name = "isActive", type = "boolean"))
@Filter(name = "activeProducts", condition = "is_active = :isActive")
public class Product {
@Id
private Long id;
private String name;
private boolean isActive;
// getters and setters
}
@NaturalIdCache
Bu annotasyon, doğal kimlik (natural id) tabanlı önbelleğe alma için kullanılır. Doğal kimlik tabanlı önbellekleme, doğal kimliğe göre sık erişilen varlıkların performansını artırır.
Kullanım Senaryosu: Doğal kimlik tabanlı önbelleğe alma işlemini gerçekleştirmek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.NaturalIdCache;
@Entity
@NaturalIdCache
public class User {
@Id
private Long id;
// ...
}
@NaturalId
Bu annotasyon, bir varlık alanının doğal bir kimlik (natural id) olarak işaretlendiğini belirtmek için kullanılır. Doğal kimlik, benzersiz bir değere sahip bir alanı temsil eder.
Kullanım Senaryosu: Bir varlık alanını doğal kimlik olarak işaretlemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.NaturalId;
@Entity
public class User {
@Id
private Long id;
@NaturalId
private String username;
// getters and setters
}
@Immutable
Bu annotasyon, bir varlığın değişmez (immutable) olduğunu belirtmek için kullanılır. Değişmez varlıklar, bir kez oluşturulduktan sonra durumlarının değiştirilemez olduğu anlamına gelir.
Kullanım Senaryosu: Bir varlığı değişmez olarak işaretlemek.
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Immutable;
@Entity
@Immutable
public class Product {
@Id
private Long id;
private String name;
private double price;
// getters and setters
}
@BatchSize
Bu annotasyon, ilişkili bir koleksiyonun yüklenirken kaç varlık için bir sorgu yapılacağını belirtmek için kullanılır. Büyük koleksiyonların yüklenme performansını artırmak için kullanışlıdır.
Kullanım Senaryosu: İlişkili bir koleksiyonun yüklenme performansını artırmak.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import org.hibernate.annotations.BatchSize;
import java.util.List;
@Entity
public class Order {
@Id
private Long id;
private String customerName;
@OneToMany(mappedBy = "order")
@BatchSize(size = 20)
private List<OrderItem> items;
// getters and setters
}