* inheritance ex

* add more ex and tests, formatting
This commit is contained in:
Loredana Crusoveanu 2017-11-22 14:22:59 +02:00 committed by Grzegorz Piwowarek
parent 41d7ec50a1
commit b567fba474
13 changed files with 445 additions and 0 deletions

View File

@ -12,6 +12,16 @@ import com.baeldung.hibernate.pojo.Course;
import com.baeldung.hibernate.pojo.Student; import com.baeldung.hibernate.pojo.Student;
import com.baeldung.hibernate.pojo.User; import com.baeldung.hibernate.pojo.User;
import com.baeldung.hibernate.pojo.UserProfile; import com.baeldung.hibernate.pojo.UserProfile;
import com.baeldung.hibernate.pojo.inheritance.Animal;
import com.baeldung.hibernate.pojo.inheritance.Bag;
import com.baeldung.hibernate.pojo.inheritance.Book;
import com.baeldung.hibernate.pojo.inheritance.Car;
import com.baeldung.hibernate.pojo.inheritance.MyEmployee;
import com.baeldung.hibernate.pojo.inheritance.MyProduct;
import com.baeldung.hibernate.pojo.inheritance.Pen;
import com.baeldung.hibernate.pojo.inheritance.Person;
import com.baeldung.hibernate.pojo.inheritance.Pet;
import com.baeldung.hibernate.pojo.inheritance.Vehicle;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata; import org.hibernate.boot.Metadata;
@ -50,6 +60,16 @@ public class HibernateUtil {
metadataSources.addAnnotatedClass(OrderEntry.class); metadataSources.addAnnotatedClass(OrderEntry.class);
metadataSources.addAnnotatedClass(OrderEntryIdClass.class); metadataSources.addAnnotatedClass(OrderEntryIdClass.class);
metadataSources.addAnnotatedClass(UserProfile.class); metadataSources.addAnnotatedClass(UserProfile.class);
metadataSources.addAnnotatedClass(Book.class);
metadataSources.addAnnotatedClass(MyEmployee.class);
metadataSources.addAnnotatedClass(MyProduct.class);
metadataSources.addAnnotatedClass(Pen.class);
metadataSources.addAnnotatedClass(Person.class);
metadataSources.addAnnotatedClass(Animal.class);
metadataSources.addAnnotatedClass(Pet.class);
metadataSources.addAnnotatedClass(Vehicle.class);
metadataSources.addAnnotatedClass(Car.class);
metadataSources.addAnnotatedClass(Bag.class);
Metadata metadata = metadataSources.buildMetadata(); Metadata metadata = metadataSources.buildMetadata();
return metadata.getSessionFactoryBuilder() return metadata.getSessionFactoryBuilder()

View File

@ -0,0 +1,40 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Animal {
@Id
private long animalId;
private String species;
public Animal() {}
public Animal(long animalId, String species) {
this.animalId = animalId;
this.species = species;
}
public long getAnimalId() {
return animalId;
}
public void setAnimalId(long animalId) {
this.animalId = animalId;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
}

View File

@ -0,0 +1,38 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Polymorphism;
import org.hibernate.annotations.PolymorphismType;
@Entity
@Polymorphism(type = PolymorphismType.EXPLICIT)
public class Bag implements Item {
@Id
private long bagId;
private String type;
public Bag(long bagId, String type) {
this.bagId = bagId;
this.type = type;
}
public long getBagId() {
return bagId;
}
public void setBagId(long bagId) {
this.bagId = bagId;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}

View File

@ -0,0 +1,27 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("1")
public class Book extends MyProduct {
private String author;
public Book() {
}
public Book(long productId, String name, String author) {
super(productId, name);
this.author = author;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}

View File

@ -0,0 +1,25 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Entity;
@Entity
public class Car extends Vehicle {
private String engine;
public Car() {
}
public Car(long vehicleId, String manufacturer, String engine) {
super(vehicleId, manufacturer);
this.engine = engine;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
}

View File

@ -0,0 +1,5 @@
package com.baeldung.hibernate.pojo.inheritance;
public interface Item {
}

View File

@ -0,0 +1,22 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Entity;
@Entity
public class MyEmployee extends Person {
private String company;
public MyEmployee(long personId, String name, String company) {
super(personId, name);
this.company = company;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}

View File

@ -0,0 +1,47 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import org.hibernate.annotations.DiscriminatorFormula;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "product_type", discriminatorType = DiscriminatorType.INTEGER)
// @DiscriminatorFormula("case when author is not null then 1 else 2 end")
public class MyProduct {
@Id
private long productId;
private String name;
public MyProduct() {
}
public MyProduct(long productId, String name) {
super();
this.productId = productId;
this.name = name;
}
public long getProductId() {
return productId;
}
public void setProductId(long productId) {
this.productId = productId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,27 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("2")
public class Pen extends MyProduct {
private String color;
public Pen() {
}
public Pen(long productId, String name, String color) {
super(productId, name);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}

View File

@ -0,0 +1,38 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public class Person {
@Id
private long personId;
private String name;
public Person() {
}
public Person(long personId, String name) {
this.personId = personId;
this.name = name;
}
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,27 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(name = "petId")
public class Pet extends Animal {
private String name;
public Pet() {
}
public Pet(long animalId, String species, String name) {
super(animalId, species);
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,40 @@
package com.baeldung.hibernate.pojo.inheritance;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Vehicle {
@Id
private long vehicleId;
private String manufacturer;
public Vehicle() {
}
public Vehicle(long vehicleId, String manufacturer) {
this.vehicleId = vehicleId;
this.manufacturer = manufacturer;
}
public long getVehicleId() {
return vehicleId;
}
public void setVehicleId(long vehicleId) {
this.vehicleId = vehicleId;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
}

View File

@ -0,0 +1,89 @@
package com.baeldung.hibernate;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.baeldung.hibernate.pojo.inheritance.Bag;
import com.baeldung.hibernate.pojo.inheritance.Book;
import com.baeldung.hibernate.pojo.inheritance.Car;
import com.baeldung.hibernate.pojo.inheritance.MyEmployee;
import com.baeldung.hibernate.pojo.inheritance.Pen;
import com.baeldung.hibernate.pojo.inheritance.Pet;
public class InheritanceMappingIntegrationTest {
private Session session;
private Transaction transaction;
@Before
public void setUp() throws IOException {
session = HibernateUtil.getSessionFactory()
.openSession();
transaction = session.beginTransaction();
}
@After
public void tearDown() {
transaction.rollback();
session.close();
}
@Test
public void givenSubclasses_whenQuerySingleTableSuperclass_thenOk() {
Book book = new Book(1, "1984", "George Orwell");
session.save(book);
Pen pen = new Pen(2, "my pen", "blue");
session.save(pen);
assertThat(session.createQuery("from MyProduct")
.getResultList()
.size()).isEqualTo(2);
}
@Test
public void givenSubclasses_whenQueryMappedSuperclass_thenOk() {
MyEmployee emp = new MyEmployee(1, "john", "baeldung");
session.save(emp);
assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Person")
.getResultList()
.size()).isEqualTo(1);
}
@Test
public void givenSubclasses_whenQueryJoinedTableSuperclass_thenOk() {
Pet pet = new Pet(1, "dog", "lassie");
session.save(pet);
assertThat(session.createQuery("from Animal")
.getResultList()
.size()).isEqualTo(1);
}
@Test
public void givenSubclasses_whenQueryTablePerClassSuperclass_thenOk() {
Car car = new Car(1, "audi", "xyz");
session.save(car);
assertThat(session.createQuery("from Vehicle")
.getResultList()
.size()).isEqualTo(1);
}
@Test
public void givenSubclasses_whenQueryNonMappedInterface_thenOk() {
Bag bag = new Bag(1, "large");
session.save(bag);
assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Item")
.getResultList()
.size()).isEqualTo(0);
}
}