cancel
Showing results for 
Search instead for 
Did you mean: 

Saving Interface based Projections

mick
Node

Is it possible to save Interface based Projections?

Can't see anything in the documentation saying you can't, but getting the following error when I try:

org.springframework.data.mapping.MappingException: Constructor parameter names aren't available, please recompile your domain.

1 ACCEPTED SOLUTION

gerrit_meier
Neo4j
Neo4j

Ah, ok. I think the basic problem is, that you are trying to persist an interface instead of a DTO with this call chain. 
And now the exception make sense to me. You cannot create an instance of an interface (this easy) and it would not make any sense in this case, because the interface projection is in general a read-only representation.

An example for DTO (https://github.com/spring-projects/spring-data-neo4j/blob/0e055f96d01dd30ad157d4c1052e3ce81a421025/s...)

View solution in original post

5 REPLIES 5

gerrit_meier
Neo4j
Neo4j

Yes, this possible. Did you have a look at the documentation? https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#projections or more specific for saving through the Neo4jTemplate: https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#projections.sdn.persistence

mick
Node

Yes read through the document.

Interface based projections work fine UNTIL I try and persist changes. 

Class based projections allow me to persist.

 

neo4jTemplate.save(MyEntity.class).one(myInterfaceInstance);

 

 

gerrit_meier
Neo4j
Neo4j

Ah, ok. I think the basic problem is, that you are trying to persist an interface instead of a DTO with this call chain. 
And now the exception make sense to me. You cannot create an instance of an interface (this easy) and it would not make any sense in this case, because the interface projection is in general a read-only representation.

An example for DTO (https://github.com/spring-projects/spring-data-neo4j/blob/0e055f96d01dd30ad157d4c1052e3ce81a421025/s...)

@gerrit_meier Thanks for the reply. Thats what I had assumed but couldn't find it stated in the doco, so thanks for verifying.

Looking at that example dto you posted I see it uses a multi level projection for mayor, citizens and cityEmployees. I've had no luck getting this to work in my project with class based projections, and get a ClassCastException when I load the projection using the repository: Cannot cast MyEntity to MyProjection. 

 

mick
Node

@gerrit_meier Any chance you can help with some direction on my other question. Trying to plan migration to latest version, and trying to get my head around best approach to use projections to limit the amount of graph that gets loaded.

https://community.neo4j.com/t5/drivers-stacks/classcastexception-using-multi-level-projection/td-p/6...

Nodes 2022
Nodes
NODES 2022, Neo4j Online Education Summit

On November 16 and 17 for 24 hours across all timezones, you’ll learn about best practices for beginners and experts alike.