1

In einer Spring @RestController Methode versuche ich zuerst zu überprüfen, ob eine Entität vorhanden ist, bevor Sie es mit Spring Data CrudRepository speichern, so dass ich eine 404 Not Found-Antwort beim Aufrufen einer PUT auf eine Sub-Ressource, die nicht vorhanden ist, zurückgeben kann. Wenn das Unternehmen vorhanden ist, wird es dann versuchen, und speichern myObjectDao.save(myObject) aufrufen, aber ich erhalte den folgenden Fehler:Wie vermeiden Sie einen schreibgeschützten Transaktionsfehler beim Lesen einer Entität und speichern Sie dann eine Entität mithilfe von Spring Data-Repositorys in einem @RestController?

Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2108) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062) at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2578)

Hier ist mein Repository und Controller:

public interface MyObjectDao extends CrudRepository<MyObject, Integer> { 
} 

@RestController 
@RequestMapping("my-object") 
public class MyObjectRestController { 

    @Autowired 
    private MyObjectDao myObjectDao; 

    @RequestMapping(value = "{id}", method = RequestMethod.PUT) 
    public MyObject update(@PathVariable(value = "id") Integer id, 
      @RequestBody @Valid MyObject myObject) { 

     if (!myObjectDao.exists(id)) { 
      throw new ResourceNotFoundException(String.format("Entity with id %s cannot be found.", id)); 
     } 
     MyObject.setId(id); 
     return myObjectDao.save(myObject); 
    } 

Es scheint, als ob Frühling markiert die Transaktion schreibgeschützt, sobald myObjectDao.exists(id) aufgerufen wird und diese Transaktion für das Speichern erneut verwendet wird. Wie kann ich prüfen, ob eine Entität vorhanden ist, und sie dann speichern, ohne diesen Fehler zu erhalten? Vielen Dank!

+0

Benötigen Sie Ihren Dao-Code, um einen besseren Einblick zu haben. –

+0

Mein Dao-Code ist da. Es verwendet Spring Data und ist die Schnittstelle MyObjectDao, die Spring die Implementierung unter der Haube bietet. – dukethrash

+0

Ich benutze org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter, aber ich denke nicht, dass das etwas damit zu tun haben sollte. – dukethrash

Antwort

0

Wie über das Hinzufügen von @Transactional direkt mit der Update Methode eine nicht Nurlesetransaktion zu erklären, den exists und save propagiert wird (vorausgesetzt, Sie deklaratives Transaktionsmanagement verwenden)?

+0

Ich habe es dort versucht und auf der Repository-Schnittstelle und sogar an der Spitze des Controllers als schreibgeschützt falsch, auch neu implementiert und nichts beeinflusst es! – dukethrash

+0

@dukethrash könnte eine Sackgasse sein, aber welche mysql-Connector-Version verwenden Sie? https://bugs.mysql.com/bug.php?id=38747 – jp86

+0

Ich benutze mysql-connector-java 5.1.33, die die angegebene Verbindung sagt, dass der Fehler in 5.1.7 behoben wurde. – dukethrash