JPA + hibernate pobranie danych

0

Witam...

Mam problem jak rozwiązać pobieranie danych za pomocą JPA + hibernate...

Mam 2 klasy POJO

//klasa pierwsza
@Entity
@Table(name="osoba")
public class Osoba {

@Id
private Long id_osoba;

@OneToMany(targetEntity=Dane.class, fetch = FetchType.EAGER,
@Cascade( {CascadeType.ALL} )
@JoinColumn(name = "id_osoby")
private Collection<Dane> imie;


@OneToMany(targetEntity=Dane.class, fetch = FetchType.EAGER,
@Cascade( {CascadeType.ALL} )
@JoinColumn(name = "id_osoby")
private Collection<Dane> imie2;
}

//klasa druga
@Entity
@Table(name="Dane")
public class Dane {

	@Id
	@Column(name="id_dane")
	private Long idDane;
	
	private DaneEnum daneEnum;

++

public enum DaneEnum {
	imie,
	imie2
}

 

Chciałbym załadować do kolekcji imie tylko dane z tabeli Dane które w kolumnie daneEnum == imie.

Tak samo do kolekcji imie2, aby daneEnum == imie2

1

A potrafisz wyjaśnić czemu tak zrobiłeś? o_O Jeśli już bardzo nie chcesz duplikować klasy to pozwól żeby ORM sam sobie taki mechanizm napisał ;]

  1. Zrób klasę bazową Imie i dwie dziedziczące klasy PierwszeImie i DrugieImie (które będą puste)
  2. Użyj mappedSuperClass -> http://docs.oracle.com/javaee/6/api/javax/persistence/MappedSuperclass.html
  3. W klasie Osoba miej kolekcje obiektów PierwszeImie i kolekcje DrugieImie

voila, ORM sam zrobi to samo co ty zrobiłeś, tzn doda enuma w bazie, tylko że cała logika wyciągania obiektów będzie się wykonywała automatycznie...

0

Niestety imie może wystąpić 2 lub więcej razy i tak samo imie2

Szczerze chciałem zrobić jedną tabele do imie imie2 imie_matki imie_ojca

1

Ale ja nadal nie rozumiem czemu podane przeze mnie rozwiązanie ci nie pasuje.

0

Ok rzeczywiście mogę imie oraz imie2 skierować na jedną tabelę...

Nadchodzi nowy problem wczytywania danych.

Kolekcja imie oraz imie2 będzie posiadać takie same wartości. Jest jakiś sposób aby hibernate mógł odróżnić po enumie rekordy?

0

o_O? Ale ty w ogóle przeczytałeś to co ja napisałem czy nie? Jak zrobisz sobie dziedziczące encje z mappedsuperclass to JPA wrzuci je do jednej tabeli ale nadal będziesz mógł na nich operować oddzielnie. Tzn wyciągając sobie obiekty Imie dostaniesz obiekty Imie, a wyciągając Imie2 dostaniesz Imie2. W czym jest problem?
JPA samo doda sobie tam tego enuma i samo będzie się martwić jak odróżniać za jego pomocą obiekty...

0

Coś takiego mam ale z tego co piszesz to chyba coś pomieszałem...

 @Entity
public class Person{

   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="osoba_seq")
   @SequenceGenerator(name="osoba_seq", sequenceName="osoba_seq", allocationSize=1)
   private Integer id;
   
   @OneToMany(targetEntity=FirstName.class, fetch = FetchType.EAGER, orphanRemoval=true)
   @Cascade( {CascadeType.ALL} )
   @JoinColumn(name = "id_person")
   private Collection<FirstName> name = new ArrayList<>();

   @OneToMany(targetEntity=SecondName.class, fetch = FetchType.EAGER, orphanRemoval=true)
   @Cascade( {CascadeType.ALL} )
   @JoinColumn(name = "id_person")
   private Collection<SecondName> secondName = new ArrayList<>();
}

@MappedSuperclass
public abstract class Name {
@Id
   @GeneratedValue(strategy=GenerationType.TABLE, generator="imie_seq")
   @SequenceGenerator(name="imie_seq", sequenceName="imie_seq", allocationSize=1)
   protected Integer id;
   
   protected TypeNameEnum nameType;
   
   protected String name;
}

@Entity
@Table(name="Name")
public class FirstName extends Name{

   public FirstName(){
      nameType = TypeNameEnum.name;
   }
}

@Entity
@Table(name="Name")
public class SecondName extends Name{
   
   public SecondName(){
      nameType = TypeNameEnum.secondaryName;
   }
}

public enum TypeNameEnum {
   name,
   secondaryName
}

rozwiązałem problem przez adnotacje na kolekcji

@Where(clause="exists (select * from testing.imie where nametype = 1)") itp ale czy to jest dobre rozwiązanie ... i tu jest pytanie

0

Nie jest bo ręcznie robisz to co automatycznie zrobiłoby za ciebie JPA. Po co tak kombinujesz? o_O

0

to chyba się zgubiłem jak to zrobić... mała podpowiedź ;/?

1

W sumie bardziej przyda ci się tu chyba jednak inheritance single table (albo i jedno i drugie)
Popatrz tutaj:
http://www.thejavageek.com/2014/05/14/jpa-single-table-inheritance-example/

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