Kolumna dyskryminatora
Kolumna dyskryminatora
Kolumna dyskryminatora wykorzystywana jest w mapowaniu dziedziczenia klas w strategii „Single Table Inheritance„. Kolumnę wykorzystuje się do określenia wierszy powiązanych z daną klasą w strukturze dziedziczenia.
Zdefiniujmy klasę Product:
@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Getter @Setter @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "productType") public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; }
wskazując adnotację określającą kolumnę dyskryminatora:
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "productType")
Zdefiniujmy klasę Monitor:
@Entity @DiscriminatorValue("monitor") @Getter @Setter public class Monitor extends Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private int x; private int y; }
oraz klasę Laptop:
@Entity @DiscriminatorValue("laptop") @Getter @Setter public class Laptop extends Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private int ramSize; }
adnotacją:
@DiscriminatorValue("monitor")
oraz:
@DiscriminatorValue("laptop")
określamy wartość dla kolumny dyskryminatora która wskazuje na konkretną klasę w strukturze dziedziczenia.
Zweryfikujmy ten mechanizm dodając przykładowe wpisy do bazy danych:
Laptop laptop = new Laptop(); laptop.setName("laptop"); laptop.setRamSize(100); Monitor monitor = new Monitor(); monitor.setName("monitor"); monitor.setX(1000); monitor.setY(1000); productRepository.save(laptop); productRepository.save(monitor);
Odczyt:
productRepository.findAll().forEach(product -> { System.out.println(product.getName()); }); monitorRepository.findAll().forEach(monitorItem -> { System.out.println(monitorItem.getName()); System.out.println(monitorItem.getX()); System.out.println(monitorItem.getY()); }); laptopRepository.findAll().forEach(product -> { System.out.println(product.getName()); System.out.println(product.getRamSize()); });
wynik:
Hibernate: /* select generatedAlias0 from Product as generatedAlias0 */ select product0_.id as id2_0_, product0_.name as name3_0_, product0_.ram_size as ram_size4_0_, product0_.x as x5_0_, product0_.y as y6_0_, product0_.product_type as product_1_0_ from product product0_ laptop monitor Hibernate: /* select generatedAlias0 from Monitor as generatedAlias0 */ select monitor0_.id as id2_0_, monitor0_.name as name3_0_, monitor0_.x as x5_0_, monitor0_.y as y6_0_ from product monitor0_ where monitor0_.product_type='monitor' monitor 1000 1000 Hibernate: /* select generatedAlias0 from Laptop as generatedAlias0 */ select laptop0_.id as id2_0_, laptop0_.name as name3_0_, laptop0_.ram_size as ram_size4_0_ from product laptop0_ where laptop0_.product_type='laptop' laptop 100
Leave a comment