2017-02-12 18 views
0

Ich füge einige Daten auf einer MySQL-Datenbank ohne Probleme ein. Jetzt möchte ich eine weitere Spalte "date" hinzufügen und ich möchte das Datum der Einfügung als Standard einfügen. Wie kann ich das machen?Default Date Wert Hibernate

"FbData.hbm.xml":

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
    <class name="com.hibernate.FbData" table="dataresponse" catalog="karma"> 
     <id name="idData" type="java.lang.Integer"> 
      <column name="idData" /> 
      <generator class="identity" /> 
     </id> 
     <property name="likes" type="java.lang.Long"> 
      <column name="likes" not-null="false" unique="false" /> 
     </property> 
     <property name="shares" type="java.lang.Long"> 
      <column name="shares" not-null="false" unique="false" /> 
     </property> 
     <property name="time" type="string"> 
      <column name="time" not-null="false" unique="false" /> 
     </property> 
     <property name="idPage" type="string"> 
      <column name="idPage" not-null="false" unique="false" /> 
     </property> 
    </class> 
</hibernate-mapping> 

Und meine Klasse mit Getter und Setter:

public class FbData implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    private Integer idData; 
    private Long likes; 
    private Long shares; 
    private String time; 
    private String idPage; 

} 

Vielen Dank im Voraus !!!

Antwort

1

Sie @PrePersist Anmerkung verwenden können aktuelles Datum das Attribut zuweisen, bevor die Zeile Datenbank

@PrePersist 
protected void onCreate() { 
    if (date == null) { 
     date = new Date(); 
    } 
} 

Auf diese Weise eingesetzt wird, wenn Sie den Wert der date nicht festlegen und versuchen, das Objekt zu beharren auf der DB, erhalten Sie das aktuelle Datum als Wert.

+0

ich diese Methode für die Klasse setzen „FbData“ mit dem Vermerk.Ich mache die Einfügung, aber alle Felder der Spalte "Datum" sind "null". – MathiasMS

+0

Welche Version von Hibernate verwenden Sie? Starten Sie eine Session oder einen EntityManager? Ich habe eine Antwort hinzugefügt, die sowohl Hibernate-zentrische als auch JPA-zentrierte Optionen umfasst. – Naros

1

Der Hibernate-spezifische Weg besteht darin, die Annotation @CreationTimestamp zu verwenden.

@Entity 
public class SomeEntity { 
    @CreationTimestamp 
    private Date date; 
} 

Vom javadoc gefunden here:

eine Eigenschaft wie die Schaffung Zeitstempel der enthaltenden Einheit Markiert. Der Eigenschaftswert wird genau einmal auf das aktuelle JVM-Datum gesetzt, wenn die besitzende Entität zum ersten Mal gespeichert wird.

Unterstützte Immobilienarten:

  • java.util.Date
  • Kalender
  • java.sql.Date
  • Zeit
  • Timestamp

Wenn Sie möchten, dies unter Verwendung einer JPA-Spezifikation zu tun c Lösung, können Sie dies auf zwei Arten tun:

  • Wenden Sie eine Entity Listener-Handler.
  • Tragen Sie eine @PrePersist Callback-Methode auf die Entität

eine Einheit Hörer anwenden:

// A simple interface 
public interface CreationTimestampAware { 
    void setCreationTime(Date date); 
    Date getCreationTime(); 
} 

// Define the entity listener 
public class CreationTimestampListener { 
    @PrePersist 
    public void onPrePersist(Object entity) { 
    // entity implements a CreationTimestampAware interface that exposes 
    // the single method #setCreationTime which we call here to set 
    // the value on the entity. 
    // 
    // Just annotate the entities you want with this functionality 
    // and implement the CreationTimestampAware interface 
    if (CreationTimestampAware.class.isInstance(entity)) { 
     ((CreationTimestampAware) entity).setCreationTime(new Date()); 
    } 
    } 
} 

// Link to your entity 
@EntityListeners({CreationTimestampListener.class}) 
public class SomeEntity implements CreationTimeAware { 
    // specify your date property and implement the interface here 
} 

Wenn Sie die Funktionalität über mehrere Einheiten benötigen, können Sie leicht mit minimalem Aufwand in diese Haken und verwalten die Funktionalität an einem Ort statt in mehreren Entitäten.

Aber das ist eine Menge Arbeit für eine einfache, einzelne Entity-Funktion. Wenn das der Fall ist, können Sie die andere vorgeschlagene Antwort verwenden, um mit gerade hinzufügen, eine kommentierte JPA Callback-Methode auf dem Unternehmen selbst

@PrePersist 
private void onPersistCallback() { 
    // just set the value here 
    // this will only ever be called once, on a Persist event which 
    // is when the insert occurs. 
    this.date = new Date(); 
} 
Verwandte Themen