Napisanie właściwej encji

0

cześć,

Mam prostą tabelę

CREATE TABLE MyTable (
   id INTEGER PRIMARY KEY NOT NULL ,
    A_id INTEGER NOT NULL,
    B_id INTEGER NOT NULL ,
  FOREIGN KEY (B_id) REFERENCES tableB (B_id),
  FOREIGN KEY (A_id) REFERENCES tableA (A_id)
);
 

Moja encja wygląda tak:

@Entity
@Table(name = "MyTable")
public class MyTableEntity
{
private Long id;
private Long A_Id;
// private Long B_Id;
private List<B_Entity> list_of_b_elements;

@Id
@Column(name = "id")
public Long getId() {
    return id;
}

public void setId(Long Id) {
    this.Id = Id;
}

@Basic
@Column(name = "A_id")
public Long getA_Id() {
    return A_Id;
}

public void setA_Id(Long A_Id) {
    this.A_Id = A_Id;
}

@OneToMany(
        cascade = CascadeType.ALL,
        orphanRemoval = true,
        fetch = FetchType.LAZY)
public List<B_Entity> getList_of_b_elements() {
    return list_of_b_elements;
}

public void setList_of_b_elements(List<B_Entity> list_of_b_elements) {
    this.list_of_b_elements = list_of_b_elements;
}
 

Funckcja w DAO gdzie podaję A_id

List<MyTableEntity> getMyTableEntityByA_Id( Long a_Id)
{
    List<MyTableEntity> myTableEntityList = (List<MyTableEntity>) getCriteria()
            .add(Restrictions.eq("A_Id", a_Id))
            .setFetchMode("list_of_b_elements", FetchMode.JOIN)
            .list();

  return myTableEntityList;
}
 

Chcę dostąc obiekt encji w taki sposób

MyTableEntity: 
A_id << ------- for example 32
List<B_Entity>  << ----- for example B_1, B_2, B_3 elements 

Lub w taki

MyTableEntity: 
A_id << ------- for example 32
B_Entity  << -----  B_1

A_id << ------- for example 32
B_Entity  << -----  B_2

A_id << ------- for example 32
B_Entity  << -----  B_3
 

Chcę żeby była to relacja jednokierunkowa (A_Entity oraz B_Entity nie wiedzą o tym). Funkcja DAO zaciąga tylko poprawnie A_id ale nie mam listy obiektów encji B.
Nie wiem czy przy tak skonstruowanej tabeli (lub encji) mogę otrzymać tylko MyTableEntity w drugi sposób (jedno A_id i jeden obiekt B_Entity)
jeśli tak to czy powinienem zastąpić @OneToMany na

B_Entity b_element;


@OneToOne
public B_Entity get_b_element() {
    return b_element;
}
1
User_321 napisał(a):

Mam prostą tabelę

CREATE TABLE MyTable (
   id INTEGER PRIMARY KEY NOT NULL ,
    A_id INTEGER NOT NULL,
    B_id INTEGER NOT NULL ,
  FOREIGN KEY (B_id) REFERENCES tableB (B_id),
  FOREIGN KEY (A_id) REFERENCES tableA (A_id)
);
 

nie wiem czy rozumiem o co Ci chodzi - ale taka tabelka raczej nie nadaje się do tego, żeby zamodelowac one to many między mytable a tableB - no bo jak ? Jak wygląda tableB ?

0

Niestety nie mam teraz jak sprawdzić dokładnej definicji tableB. Jest tam B_id jako klucz główny oraz String napis.
Czy według Ciebie przy takiej definicji tabeli myTable jestem wstanie w encji zrobić

@OneToOne
public B_Entity get_b_element() {
    return b_element;
}
 

i uzyskać

MyTableEntity: 
A_id << ------- for example 32
B_Entity  << -----  B_1
 
A_id << ------- for example 32
B_Entity  << -----  B_2
 
A_id << ------- for example 32
B_Entity  << -----  B_3
 
0
User_321 napisał(a):

ć

@OneToOne
public B_Entity get_b_element() {
    return b_element;
}
 

i uzyskać

MyTableEntity: 
A_id << ------- for example 32
B_Entity  << -----  B_1
 
A_id << ------- for example 32
B_Entity  << -----  B_2
 
A_id << ------- for example 32
B_Entity  << -----  B_3
 

Jak w myTable będziesz miał trzy rekordy:

ID A_id B_id
1 32 1
2 32 2
3 32 3

a w tableB

ID String
1 B_1
2 B_2
3 B_3

To tak Ci wyjedzie, ale mam podejrzenie, że nie o to Ci chodzi....

0

Pierwotnie chciałem pierwszym sposobem

 
MyTableEntity: 
A_id << ------- for example 32
List<B_Entity>  << ----- for example B_1, B_2, B_3 elements 

Ale szczerze nie wiem co musiałbym zmienić żeby to osiągnąć.

Rozumiem, że w myTable mogą znajdować się rekordy gdzie B_id się powtarza np:

 
32 B_1
32 B_2
32 B_3
31 B_1
......
0
User_321 napisał(a):

Pierwotnie chciałem pierwszym sposobem

 
MyTableEntity: 
A_id << ------- for example 32
List<B_Entity>  << ----- for example B_1, B_2, B_3 elements 

Ale szczerze nie wiem co musiałbym zmienić żeby to osiągnąć.

Żeby to osiągnąć to np. w tableB możesz mieć klucz do myTable,
albo możesz mieć tabele łączącą myTable i tableB (myTable_id, tableB_id)

Rozumiem, że w myTable mogą znajdować się rekordy gdzie B_id się powtarza np:

 
32 B_1
32 B_2
32 B_3
31 B_1
......

-> Mogą.

Ogólnie to pytanie jaką funkcjonalność chcesz uzyskać? (tak z punktu widzenia użytkownika, bo użytkownicy nieczęsto zaglądają do bazy danych).
Czy też twoim celem jest robienie tabel (zadanie na zaliczenie ? ).

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