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

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*