MySql und JPA-Timestamp Problem

marky8264

Aktives Mitglied
hi,

ich habe eine Tabelle, welche als Primärschlüssel das Erstellungsdatum hat. Um zu verhindern das es zu Überschneidungen kommen kann, hab ich mir gedacht, das Datum als Timestamp zu speichern.

Das Problem ist nun, das es so aussieht, als würde jetzt das Datum zu ungenau sein, weil bei den Unit-Tests sich die Datensätze überschneiden. :(

Könnte dies jetzt daran liegen, das JPA den Timestamp mit dem MySQl-Datetime-Typ mappt oder weil ich im Programm Date verwende? ???:L

Hier ein Ausschnitt aus dem Mapping:
Java:
@Id
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="a_created_at",nullable=false)
    private Date createdAt=new Date();

mfg
 

Fant

Bekanntes Mitglied
Oder sie sind einfach gleich, weil sie zu schnell hintereinander erstellt werden. Der Standart-Konstruktor erstellt ein Datum "nur" auf die Millisekunde genau.

Java:
package de.javaforum.test;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DatumTest {

	public static void main(String [] args) {
		Date date1, date2, date3, date4, date5, date6, date7, date8, date9;
		DateFormat formatter = new SimpleDateFormat("HH:mm:ss-S");
		
		date1 = new Date();
		date2 = new Date();
		date3 = new Date();
		date4 = new Date();
		date5 = new Date();
		date6 = new Date();
		date7 = new Date();
		date8 = new Date();
		date9 = new Date();

		System.out.println(formatter.format(date1));
		System.out.println(formatter.format(date2));
		System.out.println(formatter.format(date3));
		System.out.println(formatter.format(date4));
		System.out.println(formatter.format(date5));
		System.out.println(formatter.format(date6));
		System.out.println(formatter.format(date7));
		System.out.println(formatter.format(date8));
		System.out.println(formatter.format(date9));	
	}
}

Es hat schon einige Testläufe gebraucht, bis man mal einen Unterschied sehen konnte:
Code:
16:14:18-845
16:14:18-845
16:14:18-845
16:14:18-845
16:14:18-845
16:14:18-845
16:14:18-846
16:14:18-846
16:14:18-846
 

marky8264

Aktives Mitglied
danke für die Antwort.

Ich glaube das du recht hast. Habe jetzt folgendes ausprobiert:
Java:
 @Id
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="a_created_at",nullable=false)
    private Date createdAt=new Date(System.nanoTime());

aber jetzt steht in da DB-Tabelle ein falsches Datum ???:L:
Code:
3661-12-10 13:21:36

mfg
 

Fant

Bekanntes Mitglied
Das war grade unglücklich ausgedrückt. Mit Date geht das so nicht, da Date nur auf Milisekunden genau ist.

Der Konstruktor Date(long date) erwartet die Anzahl der Milisekunden seit dem [c]January 1, 1970, 00:00:00 GMT.[/c]. Was du da reinsteckst, ist aber was komplett anderes ... deswegen kommt da auch so ein merkwürdiges Datum bei raus.

Für die Unit-Tests kannst du das ja ruhig erstmal so lassen. Grundsätzlich solltest du dich aber fragen, ob du hier nicht am Model nachbessern solltest.

Nur interessehalber: spricht denn irgendwas gegen eine fortlaufende ID? Den Timestamp kannst du ja trotzdem abspeichern.
 

marky8264

Aktives Mitglied
Asso, das erklärt natürlich die Ausgabe.

es geht mir ja nicht um die Unit-Tests. Mein Programm soll eine Mehrbenutzeranwendung werden. Auch wenn die Wahrscheinlichkeit sehr gering ist, dass es zur Überschneidungen kommt, besteht die Gefahr.

Grundsätzlich spricht zwar nichts dagegen. Der Grund für die Auswahl liegt darin, dass ich einen zweiteiligen Schlüssel verhindern wollte.

Allerdings werde ich deinen Rat befolgen und einfach eine zusätzliche Spalte, welche die Nanosekunden als Long enthält, hinzufügen.

Danke für deine Hilfe :)
mfg
 

Fant

Bekanntes Mitglied
Das versteh ich jetzt nicht ...

Du willst einen zweiteiligen Schlüssel verhindern, aber nimmst dann für die Eindeutigkeit doch noch eine weitere Spalte zusätzlich? Das widerspricht sich doch. Außerdem könntest du dann doch gleich nur die nanoTime-Spalte nehmen (das wäre jedenfalls fast identisch) ...
Das ursprüngliche Problem hast du damit übrigens auch nicht beseitigt, sondern es tritt nur noch viel seltener ein. Mit einer fortlaufenden ID hättest du solche Probleme nicht.
 

marky8264

Aktives Mitglied
sry, hab mich falsch ausgedrückt.

Mein Primärschlüssel würde normalerweise aus 2 Spalten bestehen:
Typ + fortlaufende ID (eindeutig innerhalb eines Typs)

Deswegen wollte ich nur eine Spalte nämlich den Erstellungszeitpunkt nehmen.

Ja ich weiß, aber die Wahrscheinlichkeit ist gering genug. ;)
mfg
 
M

maki

Gast
Optimistic locking mit version wird von JPA direkt unterstüzt ;)

*verschoben*
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JPA MySQL DOUBLE (6,2) mit LIKE filtern Data Tier 7
NoXiD JSF AutoIncrement on MySQL Table Data Tier 0
B Hibernate und MySQL testen Data Tier 8
vladimir JPA JBoss 7 und JPA/Hibernet mit MySQL Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
S Parsen in BigInt (mysql)? Data Tier 8
F Performance CouchDB (NoSQL) vs. MySQL Data Tier 13
D jpa/eclipselink setMaxResults() funktioniert nicht mit MySql?! Data Tier 9
G hibernate und MySql Data Tier 19
neonfly Hibernate erzeugt falsches SQL Statement (Hibernate & mySql) Data Tier 6
S JPA Extrahiere Datum vom Timestamp Data Tier 2
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
N Problem beim initialisieren des Caches Data Tier 0
S JPA Problem mit Cascading Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C JPA FetchType.LAZY, Relation @OneToMany und Problem mit dem update Data Tier 1
K Problem mit EJBs und Transaktionen Data Tier 0
G JPA: Entity Klasse @JoinColumns Problem Data Tier 2
M JPA Problem: java.sql.SQLSyntaxErrorException: Data Tier 7
H Hibernate Problem mit Lazy Loading bei @OneToMany Collections Data Tier 5
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
A JPA - ManyToMany Problem - keine Unique Mehrfachzuweisungen Data Tier 4
M Problem beim Laden von Objekten, die von anderen Applikationen in eine DB eingefügt wurden Data Tier 5
M Problem mit @Temporal Mapping und SQL Server Data Tier 3
P JPA - HashMap mit Many-to-Many Relation Problem Data Tier 4
B Problem mit @ManyToMany und CascadeType.ALL Data Tier 3
Blackskyliner [JPA][Anfänger] Problem mit Wertzuweisung aus Verbundtabelle Data Tier 2
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
B DatenquellenUpdater extends Thread - Problem mit PermGenSpace Data Tier 5
S Problem beim Insert mit Hibernate Data Tier 9
Y [openJPA] Problem mit Transaktion? Data Tier 2
A @SecondaryTable Problem Data Tier 9
N Problem beim session.flush(); Data Tier 17
Y Postgres und JPA - Primärschlüssel Problem Data Tier 3
P SQL PRoblem Hibernate? Data Tier 8
Y EJB Problem mit Transaktionen Data Tier 7
M Transaction / Session Problem Data Tier 4
G JPA 2.0 Query Problem Data Tier 3
P CORBA Problem bei EJB 3.0 Anwendung in Glassfish v3 Data Tier 7
F Problem mit Hibernate Schema Update Data Tier 2
S Lazy loading Problem Data Tier 2
M Insert-Problem mit JPA/Hibernate Data Tier 4
megachucky JPA - Problem mit Persistence Unit / Context Data Tier 1
H Hibernate Problem Data Tier 4
D Performance Problem mit Prepared Statement Data Tier 6
T Problem mit openJPA Data Tier 7
P Problem mit Data Tier 9
GilbertGrape Cascade Problem (Hibernate) Data Tier 3
C JPA Problem mit attributeOverride und mehrspaltigem PK Data Tier 2
B select "neu" statement Problem (jpql) Data Tier 8
boxi Hibernate Lazy Loading Problem Data Tier 2
M Problem mit Hibernate und SLF4J - NoSuchMethodException Data Tier 3
G Connection Problem - WAS 6.1, Hibernate, OS Authentication Data Tier 1
K Hibernate update-Problem Data Tier 36
J hibernate problem Data Tier 14
N Hibernate - Problem mit Update/Insert Data Tier 4
B Problem mit @PersistenceContext Data Tier 4
G Problem with mapped of the tables at one to one relationship Data Tier 8

Ähnliche Java Themen

Neue Themen


Oben