Java / Hibernate - les opérations d'Écriture ne sont pas autorisés en mode lecture seule

J'ai eu une fâcheuse exception beaucoup ces derniers temps, et après quelques recherches sur Google et sur ce forum je n'ai toujours pas trouvé une réponse qui pourrait résoudre mon problème.

Voici la chose - parfois, j'ai l'erreur suivante lorsque vous tentez de mettre à jour ou créer un nouvel objet avec hibernate:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:696)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:694)

Ce qui est vraiment étrange, c'est que, parfois, quand la mise à jour d'un objet avec la méthode getHibernateTemplate().saveOrUpdate(object); cela va fonctionner, mais parfois avec le même objet et en appelant la méthode qu'elle ne fonctionne pas, mais il semble dépendre de la façon dont je reçois l'objet dans la première place.

Exemple: disons que j'ai une table avec 3 champs: id, type, longueur. Ce qui peut arriver, c'est que, si je suis l'objet avec l'id et la mise à jour de la longueur, puis il va travailler. Si je reçois par le type et la mise à jour de la longueur, puis ça ne marchera pas. Donc ce que j'ai fait jusqu'à présent pour éviter le problème, c'est de récupérer l'objet de la méthode qui ne posent pas problème à plus tard, mais cela devient de plus en plus et de plus ennuyeux de l'essayer et de trouver un moyen qui fonctionne.

Aussi, maintenant j'ai cette exception lorsque vous tentez de créer un objet (mais pas toutes, seulement sur une table spécifique), et ne peut pas trouver un moyen pour une solution de contournement. Et j'ai essayé d'ajouter @Transactional(readOnly = false) dans la transaction, mais ça n'a rien changé, et l'affichage de la mode a été de dire que je n'étais pas en lecture seule de toute façon.

Des suggestions?

Modifier 26 juillet:
voici quelques concernant la configuration d'hibernate

<property name="hibernateProperties">
    <props>
        <prop key="jdbc.fetch_size">20</prop>
        <prop key="jdbc.batch_size">25</prop>
        <prop key="cglib.use_reflection_optimizer">true</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="connection.autoReconnect">true</prop>
        <prop key="connection.autoReconnectForPools">true</prop>
        <prop key="connection.is-connection-validation-required">true</prop>
    </props>
</property>

aussi, si ça peut aider

<property name="transactionAttributes">
    <props>
        <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="execute*">PROPAGATION_REQUIRED</prop>
        <prop key="add*">PROPAGATION_REQUIRED</prop>
        <prop key="create*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
    </props>
</property>

Modifier le 31 du mois d'août:
Le code dans ma classe qui étend la Classe HibernateDaoSupport, pour enregistrer les objets est:

public void createObject(Object persisObj) {
    getHibernateTemplate().save(persisObj);
}
Êtes-vous à l'aide de @Cache avec READ_ONLY mode? Ou avoir une méthode/classe annotée avec @Transactional(readOnly = true) quelque part? J'ai couru dans ces sortes de questions moi-même et a constaté que ces deux configurations de jouer un rôle sur cette erreur. Surtout si vous chargez un objet, de le modifier, et persistent encore. Je suis particulièrement pas très friands de l'utilisation de HibernateTemplate, c'est peut-être de cacher certains de configuration dans le fond. Si vous avez passé quelques extraits de votre configuration, je pourrais être en mesure de vous aider.
Merci T l'Homme de prendre le temps de répondre. J'ai donc recherche pour l'un de @Cache/@Transactionnelle dans l'ensemble de mon projet, et il n'y a pas une telle chose (et je n'ai jamais mis dans mon projet). En fait je n'ai pas la configuration de hibernate ou écrire les méthodes, mais je vais ajouter ma configuration dans le poste maintenant. En outre, cette erreur s'affiche lors de la création de certains objets, mais pas tous d'entre eux (toujours le même), de sorte qu'il n'est pas seulement lié à la mise à jour d'un objet

OriginalL'auteur Guillaume | 2011-07-24