Spring Framework ve Hibernate'de sık kullanılan anatasyonlar, açıklmaları ve örnek kullanım senaryoları


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

}





Hiç yorum yok

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo