10
votes

Forcer l'insertion hibernée sans relevés de sélection

Je tente d'insérer un nouvel enregistrement dans une table que je connais est unique avant la main. J'ai essayé d'appeler Save () sur l'objet, mais cela fait un tas de déclarations de sélection avant de faire des insertions, que je ne veux pas faire parce que je sais que l'objet est déjà unique.

J'ouvre une nouvelle session pour chaque transaction, que je peux voir être un problème, mais c'est une contrainte de mon domaine. Y a-t-il un moyen de forcer l'hibernation à ne pas faire de sélection avant d'insertion?


2 commentaires

Quelles déclarations sélectionnées génère-t-elle?


Il génère une sélection pour chaque objet de mon domaine, que je ne veux pas faire parce que je sais déjà que mes objets sont complètement nouveaux et uniques.


3 Réponses :


2
votes

Hibernate tente de déterminer si l'objet est transitoire ou non, de manière à effectuer un sélectionner avant insérer . Vous pourrez peut-être adapter cette réponse de Hibernate OneToOne Cartographie exécute une instruction Select avant l'insertion; Je ne sais pas pourquoi pour éviter le Sélectionnez .

ou, je me souviens d'un post dans un forum sur le remplacement de la colonne de la version qui hibernate utilise dans la chèque transitoire (et pour un verrouillage optimiste). Je vais éditer cette réponse quand je le trouve.


0 commentaires

10
votes

Vous pouvez utiliser la méthode persist () plutôt que d'enregistrer ().

https://forum.hibernate.org/viewtopic.php?f = 1 & T = 1011405

Cependant, Contrairement à Save (), persist () ne garantit pas que la valeur d'identification sera définie immédiatement sur l'instance persistante.

https://forum.hibernate.org/viewtopic.php?f = 1 & T = 951275

(et vous pouvez sauter au dernier message de Christian dans le fil)


0 commentaires

0
votes

hibernate ne délivre pas de sélectionner pour voir si un objet est unique sur un Enregistrer () . En fait, Hibernate n'exerce même pas d'insertion lorsque vous appelez Enregistrer () . Cela se produit lorsque vous Flush () Ou engagez la transaction. Vous devrez déterminer exactement ce que les SELECT sont pour et ce qui les initie. Pour vous aider à la réduire, vous pouvez écrire un test rapide comme xxx

et voir quelles déclarations qui produisent.


0 commentaires