2009-08-12 4 views
2

J'ai un modèle Hibernate qui utilise un type personnalisé pour représenter les champs booléens (ie, le modèle a un objet 'booléen', mais la base de données écrit un 0 ou un 1 dans un champ TINYINT Changer la valeur de l'objet booléen de (true à false ou false à true) changera la valeur sur l'objet, mais le gestionnaire de session Hibernate ne semble pas penser que l'objet a eu les valeurs changent et, par conséquent, save() n'écrit pas de code SQL dans la base de donnéesHibernate champ avec des modifications de type personnalisé, mais l'objet n'est pas marqué comme 'sale' pour la mise à jour

Ai-je besoin de faire quelque chose de spécial dans mon type personnalisé pour que les modifications soient visibles? lui-même dans les accesseurs, mais c'est aussi possible

Répondre

1

Premièrement, y a-t-il une raison pour que vous utilisiez votre type personnalisé au lieu du type booléen intégré d'Hibernate?

<property name="some_flag" type="boolean"/> 

En second lieu, non, vous n'avez pas besoin dans votre type personnalisé faire quelque chose « spéciale » mais vous avez besoin de mettre en œuvre correctement ses equals() et méthodes deepCopy() entre autres. Pouvez-vous poster la source?

0

save() n'enregistre pas réellement l'objet (ou ses modifications) dans la base de données. Il le marque comme persistant, c'est-à-dire un objet que Hibernate pense être géré. Si l'objet est détaché, appelez update().

Êtes-vous flushing the Session lorsque votre travail est terminé? Et/ou closing it?

Vous pouvez revérifier le manuel Mise en veille prolongée sur Modifying Persistent Objects (je ne dis pas que ce soit snippy, j'eu le même problème avec moi-même aujourd'hui Hibernate - oublié la différence entre save() et d'autres méthodes, et aussi oublié de flush() ma session).

2

Il existe deux solutions.

  1. appelle Hibernate méthode equals pour vérifier si l'objet a été modifié ou non, et avant qu'il appelle la méthode deepCopy pour obtenir une copie de l'objet personnalisé. Donc, dans votre méthode deepCopy, créez une nouvelle copie de l'objet personnalisé et implémentez la méthode equals correctement.

  2. La deuxième solution utilise l'approche de mélange AccessType.FIELD et AccessType.PROPERTY. Bien que ce n'est pas recommandé mais vous pouvez voir si cela vous donne des connaissances.

cela semble que votre cartographie devrait être similaire à ci-dessous.

@Entity @Table (name = TABLE_NAME)

@access (AccessType.FIELD)

public class EntityClass {

/// --- certains champs

@Column (name = "CustomCol")

@Type (type = "com.something.CustomColType ")

CustomClass CustomClass;

// - getters settters

}

Lorsque vous avez objet personnalisé dans ur classe et vous modifiez cet objet alors seulement il ne marque pas Solution 1: mettre à jour un autre attribut avec l'objet customClass Solution 2: mettre @ Access (AccessType.PROPERTY) sur le champ customClass et fournir des getters/setters pour cela comportement AccessType.Field par défaut que vous mettez au niveau de la classe.

Ce problème ne sera pas reproductible si vous avez @ Access (AccessType.PROPERTY) au niveau de la classe.

Questions connexes