Hibernate dodanie dziecka do rodzica - dziedziczenie

0

Witam, rozpocząłem niedawno naukę hibernete, i mam taki problem. Do celów testowych Stworzyłem klasę Chłop w której jest imię i nazwisko. Mam też dwie klasy Farmer i Rolnik dziedziczące po klasie Chlop. Farmer posiada pole "swinie" określające ilość posiadanych zwierząt , a Rolnik pole "pole" określające powierznie posiadanego pola.

oto kod :

 
public class Chlop {

	protected String imie,nazwisko;
	private long id;
	
	    

	public long getId() {
		return id;
	}

	private void setId(long id) {
		this.id = id;
	}

	public String getImie() {
		return imie;
	}

	public void setImie(String imie) {
		this.imie = imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		this.nazwisko = nazwisko;
	}
	
}

public class Farmer extends Chlop{
 int swinie;

public int getSwinie() {
	return swinie;
}

public void setSwinie(int swinie) {
	this.swinie = swinie;
}
}

 
 
public class Rolnik extends Chlop{

	private int pole;
	

	public int getPole() {
		return pole;
	}

	public void setPole(int pole) {
		this.pole = pole;
	}
}

Chlop.hbm.xml

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-05-28 05:32:57 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="nowe.Chlop" table="CHLOP">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="imie" type="java.lang.String">
            <column name="IMIE" />
        </property>
        <property name="nazwisko" type="java.lang.String">
            <column name="NAZWISKO" />
        </property>
        
          <joined-subclass  name="nowe.Farmer" extends="nowe.Chlop" table="FARMER" lazy="false"  >
        <key>
            <column name="ID" />
        </key>
        <property name="swinie" type="int">
            <column name="SWINIE" />
        </property>
    </joined-subclass>
    
      <joined-subclass name="nowe.Rolnik" extends="nowe.Chlop" table="ROLNIK" lazy="false">
        <key>
            <column name="ID" />
        </key>
        <property name="pole" type="int">
            <column name="POLE" />
        </property>
    </joined-subclass>
    </class>
</hibernate-mapping>

Klasa startowa tworząca obiekty i umieszczająca je w bazie danych:

import nowe.Chlop;
import nowe.Farmer;
import nowe.Rolnik;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


public class Start {

	public static void main(String[] agrs){
		Session session =null;
		Transaction tr=null;
		
		SessionFactory sf=new Configuration().configure().buildSessionFactory();
		session=sf.openSession();
		tr=session.beginTransaction();
		
		Chlop ch=new Chlop();
		ch.setImie("jar");
		ch.setNazwisko("nie");
		
		session.save(ch);
		
		Farmer fa=new Farmer();
		fa.setImie("jarfa");
		fa.setNazwisko("niefa");
		fa.setSwinie(2);
		
		session.save(fa);
		
		Rolnik ro=new Rolnik();
		ro.setImie("jarro");
		ro.setNazwisko("niero");
		ro.setPole(5);
		session.save(ro);
		
		tr.commit();
		
		session.flush();
		session.close();
		
		
		
		
	}
}

 

Dodanie do bazy przechodzi bez problemu.
Moje kłopoty zaczęły się kiedy chciałem, np. z Chłopa zrobić rolnika, czyli dodać mu 5 ha ziemie.

Oto moje pytania:

  1. Jak zrobić z chłopa rolnika lub farmera.
  2. jak z farmera zrobić rolnika
  3. jak z farema zrobić zwykłego chłopa
    Będę wdzięczny za każdą pomoc
0

Tak jak ty to rozwiazales to najlatwiej bedzie pobrac chlopa, utworzyc instancje rolnika ustawiajac potrzebne pola, skasowac rolnika, zapisac nowego chlopa, i masz. To oczywiscie zmieni id.

0

W Javie nie da się zmienić klasy dla istniejącego obiektu.
Musiałbyś wykasować ten obiekt i utworzyć nowy.
Jest to jednak słabe rozwiązanie szczególnie, gdy używasz bazy danych (pojawią się problemy z kluczami obcymi).

Możesz zastosować jedno z rozwiązań:

  1. Zrezygnować z dziedziczenia w tym przypadku
  2. Mieć jedną klasę "Chlop" z kolekcją obiektów "ElementGospodarstwa". Po klasie ElementGospodarstwa mogły by dziedziczyć "Swinie" i "Pole".
    Gdy Rolnik nabywa dodatkowo świnie, to dodajesz mu obiekt Swienie do jego dorobku.
0

Dzięki wielkie za pomoc. Mogę przejść dalej:D

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