JPA: Objekt in Tabelle mit Composite Keys mappen (Embeddable Annotation)

Studdi23

Mitglied
Hallo zusammen,

ich habe 4 Tabellen mit folgendem Datenbankschema:

Code:
create table books
(
isbn char(13) not null, primary key(isbn),
title char(80) not null,
fname char(40) not null,
author char(40) not null,
price numeric(6,2) not null,
year_published integer not null
);

create table customers
(
cid integer not null auto_increment, primary key (cid),
cname char(40) not null,
address char(200) not null,
cardnum char(16) not null
);

create table orders
(
ordernum integer not null auto_increment, primary key(ordernum),
cid integer, foreign key(cid) references customers(cid),
order_date date not null
);

create table orderitems
(
ordernum integer not null, foreign key(ordernum) references orders(ordernum),
isbn char(13) not null, foreign key(isbn) references books(isbn),
qty integer not null,
primary key( ordernum, isbn )
);

Der Primärschlüssel der letzten Tabelle setzt sich aus den beiden Primärschlüsseln von books und orders zusammen. Nun möchste ich mittels JPA Testdaten in die Datenbank schreiben und hab mir von Eclipse die zugehörigen Entities generieren lassen. Bei den ersten drei Tabellen funktioniert das Auslesen und Schreiben in die DB. Wenn ich noch die Beziehung Orderitems hinzunehme erhalte ich folgende Exception:

Code:
[EL Warning]: 2010-10-25 17:23:07.667--UnitOfWork(25621063)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Column 'ordernum' specified twice
Error Code: 1110
Call: INSERT INTO orderitems (QTY, ORDERNUM, ISBN, isbn, ordernum) VALUES (?, ?, ?, ?, ?)
	bind => [1, 0, null, 9-014103613-7, 44]
Query: InsertObjectQuery(de.atalay.aufgabe3.model.Orderitem@b30913)
Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Column 'ordernum' specified twice
Error Code: 1110
Call: INSERT INTO orderitems (QTY, ORDERNUM, ISBN, isbn, ordernum) VALUES (?, ?, ?, ?, ?)
	bind => [1, 0, 9-014103613-7, 9-014103613-7, 44]

Die Attribute "isbn" und "ordernum" werden, aus welchem Grund auch immer, doppelt in die Tabelle gemappt, wobei die Id von ordernum beim ersten Pärchen 0 ist. Ich vermute, dass das etwas mit den für die Entity Orderitem generierten Klassen zu tun hat. Es wurden sowohl eine @Embeddable annotierte Klasse mit Gettern/Settern der Primärschlüssel, als auch eine Klasse mit einer Referenz auf diese Klasse generiert. Die Referenz ist mit @EmbeddedId annotiert. Ich weiß nicht wie ich mit diesen beiden Objekten umgehen soll, da ich noch nie Composite Keys benutzt habe. Kennt sich jemand mit dem mapping von "natürlichen" bzw. zusammengesetzten Primärschlüsseln aus und kann mir weiterhelfen?

Java:
@Entity
@Table(name="orderitems")
public class Orderitem implements Serializable {
	private static final long serialVersionUID = 1L;

	@EmbeddedId
	private OrderitemPK id;

	private int qty;

    @ManyToOne
	@JoinColumn(name="isbn")
	private Book book;

    @ManyToOne
	@JoinColumn(name="ordernum")
	private Order order;

    public Orderitem() {
    }
    
	public Orderitem(OrderitemPK id, int qty, Book book, Order order) {
		super();
		this.id = id;
		this.qty = qty;
		this.book = book;
		this.order = order;
	}
//Getter und Setter Methoden

Java:
@Embeddable
public class OrderitemPK implements Serializable {
	private static final long serialVersionUID = 1L;

	private String isbn;

	private int ordernum;

    public OrderitemPK() {
    }
//Getter und Setter Methoden

Java:
private static final String PERSISTENCE_UNIT_NAME = "AmazonJPA";
	private static EntityManagerFactory factory;

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		EntityManager em = factory.createEntityManager();			
		em.getTransaction().begin();
		Book newBook = new Book("9-014103613-7", "Animal Farm", "GO-AF",
				"George Orwell", new BigDecimal(6.40), 2008, null);
		
		Customer cust = em.find(Customer.class, 1);
		Order order = new Order();
		order.setOrderDate(new Date());
		order.setCustomer(cust);
		
		Orderitem ordIt = new Orderitem();
		ordIt.setOrder(order);
		ordIt.setBook(newBook);
		ordIt.setQty(1);
		List<Orderitem> orderItems = new ArrayList<Orderitem>();
		orderItems.add(ordIt);
		
		OrderitemPK ordPK = new OrderitemPK();
		ordPK.setIsbn(ordIt.getBook().getIsbn());
		ordPK.setOrdernum(ordIt.getOrder().getOrdernum());
		ordIt.setId(ordPK);
		
		order.setOrderitems(orderItems);		
		newBook.setOrderitems(orderItems);
		
		em.persist(newBook);
		em.persist(order);
		em.persist(cust);
		em.persist(ordIt);
		
		em.getTransaction().commit();
		em.close();
 
Zuletzt bearbeitet:

Studdi23

Mitglied
Hier noch die anderen beiden Klassen, die mit Orderitem in Beziehung stehen:

Java:
@Entity
@Table(name="books")
public class Book implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private String isbn;

	private String author;

	private String fname;

	private BigDecimal price;

	private String title;

	@Column(name="year_published")
	private int yearPublished;

	@OneToMany(mappedBy="book")
	private List<Orderitem> orderitems;

    public Book() {
    }
        
	public Book(String isbn, String title, String fname, String author, BigDecimal price,
		 int yearPublished, List<Orderitem> orderitems) {
		super();
		this.isbn = isbn;
		this.author = author;
		this.fname = fname;
		this.price = price;
		this.title = title;
		this.yearPublished = yearPublished;
		this.orderitems = orderitems;
	}
//Getter und Setter

Java:
@Entity
@Table(name="orders")
public class Order implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int ordernum;

    @Temporal( TemporalType.TIMESTAMP)
	@Column(name="order_date")
	private Date orderDate;

	@OneToMany(mappedBy="order")
	private List<Orderitem> orderitems;

    @ManyToOne
	@JoinColumn(name="cid")
	private Customer customer;
//Getter und Setter
 

Studdi23

Mitglied
Hat sich erledigt. Die JPA-Tools von Eclipse generieren die Entities scheinbar nicht ganz korrekt. Für alle die das gleiche Problem haben. In der Embeddable Klasse müssen die beiden Primärschlüssel zusätzlich mit folgender Annotation versehen werden:

@Column(name = "isbn", nullable = false, insertable=false, updatable=false)
@Column(name = "ordernum", nullable = false, insertable=false, updatable=false)

Danach wurden die Daten korrekt in die DB geschrieben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
tom.j85 Objekt in OneToOne Beziehung über http request anzeigen lassen Datenbankprogrammierung 3
C Objekte aus DB in Strings umwandeln also von List<Objekt> in String Datenbankprogrammierung 6
S Mit 2 Queries ein Objekt erstellen Datenbankprogrammierung 6
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
H JDBCODBC - Connection-Objekt Datenbankprogrammierung 3
N Java-Objekt dynamisch aus Datenbanktabelle erzeugen? Datenbankprogrammierung 4
W MySQL-Connection-Objekt übergeben Datenbankprogrammierung 2
G MySQL Zugriff auf Datenbank Objekt Datenbankprogrammierung 19
M JPA-Query - nicht das komplette Objekt Datenbankprogrammierung 4
J Derby/JavaDB NullPointerException bei VORHANDENEM EntityManager-Objekt!!! Datenbankprogrammierung 3
kirchrath Hibernate Join - angejointes Objekt wählen Datenbankprogrammierung 2
P MySQL Objekt aus BLOB auslesen Datenbankprogrammierung 3
Y JPQL WHERE != Objekt Datenbankprogrammierung 10
J Datenbank: Record-Objekt Datenbankprogrammierung 2
M \t in List-Objekt Datenbankprogrammierung 5
S Java objekt in MYSQL auslesen Datenbankprogrammierung 32
M Java Objekt in Datenbank schreiben :( Datenbankprogrammierung 8
G objekt zurück setzen Datenbankprogrammierung 2
sparrow Objekt mit lazy-verbindung komplettieren Datenbankprogrammierung 13
A Fehlermeldung "Objekt bereits geschlossen" Datenbankprogrammierung 3
A JDBC-Fehler "Objekt bereits geschlossen" Datenbankprogrammierung 4
Y Hibernate - 1:1 Beziehung liefert leeres Objekt Datenbankprogrammierung 19
S Hibernate - Ein Referenziertes Objekt mit Sprichern Datenbankprogrammierung 5
P [Hibernate] Objekt laden, Id ändern und speichern? Datenbankprogrammierung 2
R Hibernate speichert nur das Basis-Objekt Datenbankprogrammierung 4
M Objekt in Datenbank speichern Datenbankprogrammierung 2
J Wie kann ich in ein OLE-Objekt reinschreiben ? Datenbankprogrammierung 2
K relationale vs. objekt-orientierte Datenbank Datenbankprogrammierung 4
L Objekt in die DB speichern und die Id zurückgeben Datenbankprogrammierung 2
D Ich möchte dass ich nachdem man den Kommentar geschrieben hat den Kommentar in den Tabelle Bestellübersicht geschbeichert wird klappt nicht bei mir Datenbankprogrammierung 2
D Tabelle an Persistenzeinheit binden Datenbankprogrammierung 1
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
S gesamte Tabelle löschen Datenbankprogrammierung 2
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
Kirby.exe Eine Tabelle updaten Datenbankprogrammierung 16
L SQL Tabelle Datenbankprogrammierung 11
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
J Oracle Datenbank-Tabelle per Combobox (oder ähnliches) auswählen Datenbankprogrammierung 3
P Derby/JavaDB Datenbanktabelle erweitern, ohne Tabelle zu ändern Datenbankprogrammierung 6
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
S FilterSearch Tabelle Datenbankprogrammierung 4
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
N Dynamische Tabelle Datenbankprogrammierung 84
T Zeitraum aus SQL-Tabelle Datenbankprogrammierung 3
V SQLite 2 Tabelle vergleichen und alle unterschiede rausgeben Datenbankprogrammierung 1
D UCanAccess / MS Access - Tabelle / Spalte vorhanden Datenbankprogrammierung 3
M MySQL wie Listen oder arras in Tabelle(n) schreiben Datenbankprogrammierung 10
Paul15 Tabelle vergleichen Datenbankprogrammierung 15
J Tabelle synchronisieren mit Datenbank Datenbankprogrammierung 7
E Wie kann man bestimmte Zeilen der Tabelle rot markieren? Datenbankprogrammierung 1
L Tabelle mit Inhalt füllen Datenbankprogrammierung 2
J Optimierung von Querys/ ausgegebene Tabelle mit in neue Anfrage einbinden Datenbankprogrammierung 2
M Derby/JavaDB Kleine DB mit Tabelle erweitern - Integrität - Alter-Table - Netbeans ... Datenbankprogrammierung 5
C Tabelle erstellen mit Apache JDBC-Util Datenbankprogrammierung 1
A MySQL Tabelle ID abfragen und Spalte ausgeben Datenbankprogrammierung 4
S Update Tabelle aus Textfeld Datenbankprogrammierung 2
A MySQL Problem bei Tabelle ausgeben Datenbankprogrammierung 3
E Nur der letzte Datensatz wird in Tabelle geschrieben Datenbankprogrammierung 4
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
Joew0815 Datenmerge große Tabelle Datenbankprogrammierung 16
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
P Neue Tabelle dazugekommen Datenbankprogrammierung 1
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
J Normalisierung - Aufspaltung der Tabelle Datenbankprogrammierung 4
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
S Wie muss meine SQL Tabelle aufgebaut sein, um unendliche Attribute zu vermeiden Datenbankprogrammierung 2
R HSQLDB Tabelle in JTable übertragen Datenbankprogrammierung 3
S MySQL Einfügen in Tabelle nur von Programm zulassen Datenbankprogrammierung 7
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
N Temporäre tabelle MySQL Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
D DB Tabelle in JTable anzeigen - Probleme Datenbankprogrammierung 8
Rudolf MySQL MySQL Tabelle mit Fremdschlüsseln in JTable darstellen Datenbankprogrammierung 5
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D JPA (Hibernate) : Tabelle zweimal joinen Datenbankprogrammierung 4
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
N [XLS]Strings in Excel-Tabelle schreiben (poi) Datenbankprogrammierung 2
M DB View in Tabelle konvertieren in DB2? Datenbankprogrammierung 2
N Einzelne Spalte in MySQL-DB-Tabelle schreiben Datenbankprogrammierung 7
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
I Derby/JavaDB Problem mit Befüllung von Tabelle Datenbankprogrammierung 7
H MySQL Tabelle "Table" programmieren Datenbankprogrammierung 2
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
I Tabelle mit "|" getrennten Werten -> einzelnen Wert davon abfragen Datenbankprogrammierung 15
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben