2017-02-12 2 views
0

J'insère sans problème des données sur une base de données MySQL. Maintenant, je veux ajouter une colonne "date" et je veux insérer par défaut la date de l'insertion. Comment puis je faire ça?Valeur par défaut 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> 

Et ma classe avec accesseurs:

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; 

} 

Merci à l'avance !!!

Répondre

1

Vous pouvez utiliser l'annotation @PrePersist pour attribuer date à l'attribut avant d'insérer la ligne de base de données

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

De cette façon, si vous ne définissez pas la valeur du date et essayer de conserver l'objet la base de données, vous obtiendrez la date actuelle comme valeur.

+0

je mets cette méthode sur la classe « FbData » avec l'annotation.Je fais l'insertion mais tous les champs de la colonne "date" sont "null". – MathiasMS

+0

Quelle version d'Hibernate utilisez-vous? Êtes-vous en train d'amorcer une session ou un EntityManager? J'ai ajouté une réponse qui couvre les options Hibernate-centric et JPA-centric. – Naros

1

La méthode spécifique d'Hibernate est d'utiliser l'annotation @CreationTimestamp.

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

De l'javadoc trouvé here:

marque une propriété comme l'horodatage de création de l'entité contenant. La valeur de propriété sera définie à la date JVM actuelle exactement une fois lors de la première sauvegarde de l'entité propriétaire.

types de propriété pris en charge:

  • java.util.Date
  • Calendrier
  • java.sql.Date
  • temps
  • Timestamp

Si vous voulez pour ce faire en utilisant une spécification JPA c solution, vous pouvez le faire de deux manières:

  • Appliquez un gestionnaire Entity Listener.
  • Appliquer une méthode de rappel @PrePersist sur l'entité

Pour appliquer un écouteur d'entité:

// 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 
} 

Si vous avez besoin de la fonctionnalité sur plusieurs entités, vous pouvez facilement connecter cela avec un minimum d'effort et de gérer la fonctionnalité dans un endroit plutôt que dans plusieurs entités.

Mais cela représente beaucoup de travail pour une entité simple à entité unique. Si tel est le cas, vous pouvez utiliser l'autre réponse suggérée avec juste l'ajout d'une méthode de rappel JPA annotée sur l'entité elle-même

@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(); 
}