Hibernate, a wywoływanie konstruktorów.

0

Bawie sie z bazami danych i jpa, wczesniej napisalem sobie pare klas, ktore teraz postanowilem wrzucic do DB.

Moze najpierw kod:

Klasa Animal

package kaczynski.impl;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Animal {
	
	@Id
	@GeneratedValue
	private int id;
	
	private String name;
	
	private int age;
	
	private LocalDate dateOfBirth;
	
	private double weight;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public LocalDate getDateOfBirth() {
		return dateOfBirth;
	}
	public void setDateOfBirth(LocalDate dateOfBirth) {
		this.dateOfBirth = dateOfBirth;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	
	public Animal(){
		String date=null;
		Scanner input = new Scanner(System.in);
			
		System.out.println("Podaj imie");
		String name = input.nextLine();
		this.setName(name);
		
		System.out.println("Podaj wiek");
		int age = input.nextInt();
		this.setAge(age);
		
		System.out.println("Podaj wage");
		double weight = input.nextDouble();
		this.setWeight(weight);
		
		do{
		System.out.println("Podaj date narodzin w formacie DD-MM-YYYY");
		date = input.nextLine();
		}while(!this.dateValidation(date));
		
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
		LocalDate date1 = LocalDate.parse(date, formatter);
		this.setDateOfBirth(date1);
			
	}
	
	@Override
	public String toString() {
		return "name=" + name + ", age=" + age + ", dateOfBirth="
				+ dateOfBirth + ", weight=" + weight;
	}
	private  boolean dateValidation(String date){
		Pattern pattern = Pattern.compile("[0-3]?[1-9]-[0-1]?[1-9]-[1-2][0-9]{3}");
		Matcher matcher = pattern.matcher(date);
		
		return matcher.matches();
	}
	public Animal(String name, int age, String dateOfBirth, double weight) {
		this.name = name;
		this.age = age;
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
		LocalDate date1 = LocalDate.parse(dateOfBirth, formatter);
		this.setDateOfBirth(date1);
		this.weight = weight;
	}
	
	
}

Klasa animal jest klasa bazowa dla kota

package kaczynski.impl;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import kaczynski.api.VitalFunctions;
@Entity
public class Cat extends Animal implements VitalFunctions {

	
//	@Id
//	@GeneratedValue
//	private int id;
	private String race;
	private String furColor;

	public String getRace() {
		return race;
	}

	public void setRace(String race) {
		this.race = race;
	}

	public String getFurColor() {
		return furColor;
	}

	public void setFurColor(String furColor) {
		this.furColor = furColor;
	}

	@Override
	public String giveVoice() {
		return "Miauuu";
	}
	
	public Cat() {
		Scanner input = new Scanner(System.in);
		
		System.out.println("Podaj kolor futra");
		String furColor = input.nextLine();
		this.setFurColor(furColor);
		
		System.out.println("Podaj rase kota");
		String race = input.nextLine();
		this.setRace(race);
			
	}

	@Override
	public String toString() {
		return "Cat [race=" + race + ", furColor=" + furColor +  super.toString()+ "]" ;
	}

	public Cat(String race, String furColor,String name, int age, String dateOfBirth, double weight) {
		super(name,age,dateOfBirth,weight);
		this.race = race;
		this.furColor = furColor;
	}
	

}

klasa main

package kaczynski.main;

import java.util.ArrayList;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import kaczynski.impl.Animal;
import kaczynski.impl.Cat;
import kaczynski.impl.Snake;

public class Main {
	
	private static EntityManager entityManager;
	private static EntityManagerFactory entityManagerFactory;
	
	private ArrayList<Animal> listAnimal = new ArrayList<>();

	public static void main(String[] args) {
		
		entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
		entityManager = entityManagerFactory.createEntityManager();
		
		//addAnimals();
		Animal Cat = new Cat("Persian", "Brown", "Jack", 3, "12-11-2009", 3.2);
		 entityManager.getTransaction().begin();
		 entityManager.persist(Cat);
		 entityManager.getTransaction().commit();
		entityManager.close();
		entityManagerFactory.close();

	}// end of main

	private static void addCat() {
		 Animal Cat = new Cat("Persian", "Brown", "Jack", 3, "12-11-2009", 3.2);
		 entityManager.getTransaction().begin();
		 entityManager.persist(Cat);
		 entityManager.getTransaction().commit();
	}

	private static void addDog() {
		Animal Dog = new kaczynski.impl.Dog(true, "Janosik", "Burek", 1, "11-12-1992", 6.5);
		entityManager.getTransaction().begin();
		entityManager.persist(Dog);
		entityManager.getTransaction().commit();
	}

	private static void addSnake() {
		Animal snake = new Snake(true, 5.6, "Sekacz", 2, "17-11-1111", 6.5);
		entityManager.getTransaction().begin();
		entityManager.persist(snake);
		entityManager.getTransaction().commit();
	}
	
	private static void addAnimals(){
		addCat();
		//addSnake();
		//addDog();
		
	}

}

Przy zapisie do bazy danych obiektu Cat, wywolywany jest kontruktor domyslny, z klasy Animal i Cat, do samej bazy idzie obiekt zdefiniowany konstruktorem z parametrami.

Jednak nie rozumiem czemu wywoluje mi sie podczas dzialania programu konstruktor domyslny i to jest moje pytanie do Was.

1

Hibernate wykorzystuje domyślny konstruktor do tworzenia nowych instancji obiektów. Czyli korzysta z:

Class<T>.newInstance()

i przy pomocy refleksji lub getterów i setterów ustawia pola klasy. Nie korzysta z konstruktorów z argumentami. Bean powinien posiadać konstruktor bez argumentów. Poza tym, czy nie sądzisz, że wczytywanie danych lepiej umieścić w innym miejscu?

0
Jaca777 napisał(a):

. Poza tym, czy nie sądzisz, że wczytywanie danych lepiej umieścić w innym miejscu?

co masz na mysli?

1

Po pierwsze to, że jest to rozwiązanie Twojego problemu. Po drugie, niepotrzebnie wprowadzasz tam sposób uzyskiwania wartości pól. Wiem, że to jest tylko "ćwiczebny" projekt, ale lepiej wcześnie wyrabiać u siebie takie nawyki. Umieszczając to poza tym beanem łatwo możesz używać takiego modelu przez wiele różnych interfejsów i modułów. Do tego łatwiej będzie Ci znaleźć błąd, a także trudniej go popełnić. Dochodzi jeszcze łatwość testowania.

0

@filemonczyk, wiążesz model danych z konkretną technologią interfejsu użytkownika. Będziesz musiał przepisać model danych aby zmienić tę aplikację na okienkową albo webową, to jest utrudnianie sobie życia.
Poczytaj o zasadzie SRP.

0

Mialem w zamysle zrobic konsolowy interfejs a pozniej sprobowac to przerobic na web. Zakladalem ze skonczy sie to pisaniem wszystkiego od nowa. Planuje wrzucic to na guthub a pozniej poprosic o code review wiec bedzie 'kupa smiechu'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1