JPA und zusammengesetzter PK

TheGreenDragon

Erfahrenes Mitglied
Hallo,

also ich habe vier Tabellen Kunden, Aufträge, Auftragselemente, Bücher.
nun besteht jedoch die Tabelle Auftragselemente nur aus drei spalten AuftragsId, ISBN, Laufnummer.

Nun hat NetBeans beim laden des DB-Schemas und erzeugen der Entity-Klassen eine eine extra Klasse, AuftragslementePK erstellt.
Leider weiß ich jetzt nicht wie ich ausgehend vom Kunden(PK id) Aufträge(FK id, PK num) anlegen kann, die mehrere Auftragselemente(PK num, PK isbn) beinhalten, welche wiederum @OneToOne einem Buch(PK isbn) zugeordnet sind.

Weiß einfach nicht wie ich die annotations richtige setzten muss :confused:
Also von Kunden zu Aufträgen hab ich und von Aufträgen und Auftragselementen auch. Aber von Auftragselemente zu Bücher was eigentlich eine @OneToOne Beziehung ausgehend von Auftragselemente ist, bin ich am grübeln weil da ja auch noch die Klasse AuftragselmentePK da ist, die NetBeans selbst erstellt hat...

Hat jemand ein Beispiel für mich wie man mit zusammgesetzten PKs umgeht in JPA und wie man die Annotations richtig setzt damit man von z.B. einem Kunden aus alles anlegen kann?

Gruß
Green
 
Also, das Ganze könnte in etwa so aussehen:

Tabellen:
SQL:
create table Book (isbn varchar(255) not null, title varchar(255), primary key (isbn));
create table BookOrder (id bigint not null, customer_id bigint, primary key (id));
create table Customer (id bigint not null, name varchar(255), primary key (id));
create table OrderItem (position integer not null, order_id bigint, book_isbn varchar(255), primary key (book_isbn, order_id, position));
alter table BookOrder add index FKEF3FE5C5B24C08F5 (customer_id), add constraint FKEF3FE5C5B24C08F5 foreign key (customer_id) references Customer (id);
alter table OrderItem add index FK60163F61C2D738F6 (order_id), add constraint FK60163F61C2D738F6 foreign key (order_id) references BookOrder (id);
alter table OrderItem add index FK60163F616466DAF0 (book_isbn), add constraint FK60163F616466DAF0 foreign key (book_isbn) references Book (isbn);

Book.java:
Java:
@Entity
public class Book {

    @Id
    private String isbn;

    private String title;

    public Book() {

    }
//Getter und Setter

Customer.java:
Java:
@Entity
public class Customer {

    @Id
    private Long id;

    private String name;

    @OneToMany(mappedBy = "customer")
    private Set<BookOrder> orders;

//Getter und Setter

BookOrder.java:
Java:
@Entity
public class BookOrder {

    @Id
    private Long id;

    @ManyToOne
    private Customer customer;

    @OneToMany(mappedBy = "id.order", cascade=CascadeType.ALL)
    @OrderBy("id.position")
    private Set<OrderItem> items;

//Getter und Setter

OrderItem.java:
Java:
@Entity
public class OrderItem {

    @EmbeddedId
    private OrderItemPK id;

//Getter und Setter

OrderItemPK.java:
Java:
@Embeddable
public class OrderItemPK implements Serializable {

    @ManyToOne
    private BookOrder order;

    @ManyToOne
    private Book book;

    private Integer position;

//Getter und Setter

Verwendung:
Java:
...
Book b1 = new Book("12123123", "a book");
Book b2 = new Book("3456345656", "another book");
em.persist(b1);
em.persist(b2);

Customer c = new Customer();
c.setId(1L);
c.setName("Max Mustermann");
em.persist(c);

BookOrder o = new BookOrder();
o.setId(1L);
o.setCustomer(c);
em.persist(o);

Set<OrderItem> items = o.getItems();
OrderItem item1 = new OrderItem();
item1.setId(new OrderItemPK(1, o, b1));
items.add(item1);

OrderItem item2 = new OrderItem();
item2.setId(new OrderItemPK(2, o, b2));
items.add(item2);
...

Hoffe das ist verständlich

Gruß
Matthias
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück