2017-06-13 2 views
0

Permettez-moi de configurer le scénario avant de poser les questionsHibernate Parent Enfant mise à jour

Tout d'abord j'utilise une ancienne version d'Hibernate Hibernate Version: 3.6.10.Final

J'ai un questionnaire/personne tables qui ont une relation un à un les uns avec les autres.

Voici ma table de Questionnaire (Partielle bien sûr) et seulement la partie pertinente.

@Entity 
public class Questionnaire { 

... 

@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "person_id") 
private Person person; 

... 

} 

Voici ma table Person (Partielle bien sûr) et seulement la partie pertinente.

@Entity 
public class Person { 

... 

@OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, optional = false) 
@JoinColumn(name="questionnaireInfo_id", unique=true) 
private QuestionnaireInfo questionnaireInfo; 


.... 

} 

Si je mets à jour l'objet du questionnaire et enregistrer l'entité questionaire (ne pas utiliser HQL ou une syntaxe de type SQL) sera elle aussi mettre à jour ma table personne aussi bien et verrouiller cette table quand il sauve? [Même si l'identifiant de la personne reste le même qu'avant]

J'utilise PostgreSQL 9.5.6 sur x86_64-pc-linux-gnu, compilé par gcc (GCC) 4.8.5 20.150.623 (Red Hat 4.8.5 -11), 64 bits

+0

test probablement par vous-même vous donnera la réponse la plus fiable possible. Dans mon expérience, si vous ne changez pas un objet, il n'est pas mis à jour, mais n'a pas essayé ce scénario particulier. –

Répondre

0

un à un est pas vraiment paresseux lorsque vous déclarez avec FetchType.LAZY

Lire ici: http://justonjava.blogspot.de/2010/09/lazy-one-to-one-and-one-to-many.html

Et essayez comme dans l'article décrit:

Il existe au moins trois solutions bien connues pour ce problème: Le plus simple est de simuler une relation un-à-plusieurs. Cela fonctionnera parce que le chargement paresseux de la collection est beaucoup plus facile que le chargement paresseux de seule propriété nullable mais généralement cette solution est très incommode si vous utilisez des requêtes complexes de JPQL/HQL.

L'autre est d'utiliser l'instrumentation bytecode de temps de construction. Pour plus de détails, veuillez lire la documentation d'Hibernate: 19.1.7. Utilisation de la récupération de propriété paresseuse. Rappelez-vous que dans ce cas, vous devez ajouter l'annotation @LazyToOne (LazyToOneOption.NO_PROXY) à la relation un-à-un pour la rendre paresseuse. Définir la récupération sur LAZY ne suffit pas.

La dernière solution consiste à utiliser des instruments d'exécution bytecode, mais il ne sera travail seulement pour ceux qui utilisent Hibernate en tant que fournisseur JPA dans complet environnement JEE (dans ce cas la mise « hibernate.ejb.use_class_enhancer » true le devrait faire l'affaire: Entity Manager Configuration) ou utiliser Hibernate avec Spring configuré pour faire le tissage à l'exécution (cela peut être difficile à réaliser sur certains anciens serveurs d'applications ). Dans ce cas, l'annotation @LazyToOne (LazyToOneOption.NO_PROXY) est également requise.

Ici, le problème est discuté: Making a OneToOne-relation lazy