I have at first sight a simple issue but can't wrap my head around on how to solve. I have an abstract class Compound
. A Compound
is made up of Structures
. Then there is also a Container
which holds 1 Compound
.
A "special" implementation of Compound
has Versions
. For that type of Compound
I want the Container
to hold the Version
of the Compound
and not the Compound
itself.
You could say "just create an interface Containable
" and a Container
holds 1 Containable
. However that won't work. The reason is I'm creating a framework and the main part of that framework is to simplify storing and especially searching for special data type held by Structure
objects. Hence to search for Containers
which contain a Compound
made up of a specific Structure
requires that the "Path" from Container
to Structure
is well defined (Number of relationships or joins).
I hope this was understandable. My question is how to design the classes and relationships to be able to do what I outlined.
EDIT:
Kind of translation issue. with version i did not mean in terms of "versioning" but more in terms of "different variety" but fundamentally the same. There is no active / inactive. All are active.
EDIT 2:
Also note that these classes are entity classes and hence complex inheritance and hierarchies can be problematic.
EDIT 3:
Just don't see how either pattern (Composite, decorator) can work. I tried but the problem is the "path traversal", eg. implementing it in the context of Spring-data and QueryDSL.
I've created Class diagramm with comments that might help to understand the issue. Batch = Version.