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!
Benötigen Sie Ihren Dao-Code, um einen besseren Einblick zu haben. –
Mein Dao-Code ist da. Es verwendet Spring Data und ist die Schnittstelle MyObjectDao, die Spring die Implementierung unter der Haube bietet. – dukethrash
Ich benutze org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter, aber ich denke nicht, dass das etwas damit zu tun haben sollte. – dukethrash