In jeder relationalen Datenbank müssen Sie immer wissen, welche Beziehungen Ihren Entitäten möglich sind. Aber manchmal sind diese Beziehungen unbekannt oder können sich jederzeit ändern. Mit dynamischen Beziehungen können Sie während der Laufzeit benutzerdefinierte Beziehungen zwischen Entitäten hinzufügen oder löschen.
Eine dynamische Beziehung kann als gerichteter Diagramm mit einem festen Eingang (SourceObject) und einem dynamischen Ausgang (Ziel) betrachtet werden.
Flussdiagramm LR
Subgraph -Dynamikrelation
Richtung LR
SourceObject-> Ziel
Ende
Zum Beispiel mit folgenden Einheiten:
Eine Person kann einen Hund haben und beide Ansprüche könnten Dokumente haben (Personeninformationsdokumente und Hundeinfo -Dokumente). Jetzt könnten Sie allen Entitäten dynamische Beziehungen hinzufügen, die so aussehen könnten:
Graph TD;
Person-> Hund;
Person-> Person_Document
Hund-> Dog_document;
Jede Verbindung ist eine dynamische Beziehung, und die folgenden Beziehungen werden generiert:
Jede Beziehung hat ein dynamisches Ziel erhalten, dh Sie können eine Beziehung zu einer anderen Entität herstellen.
In diesem Szenario hat eine Person einen Hund und beide Dokumente, jetzt könnten Sie die Beziehung während der Laufzeit ändern (keine Änderung Ihrer Entitäten oder Modelle). Sie können beispielsweise ein Person_Document löschen (verloren gegangen):
Graph TD;
Person-> Hund;
Hund-> Dog_document;
<dependency>
<groupId>io.github.Mom0aut</groupId>
<artifactId>dynamic-relations</artifactId>
<version>1.0.4</version>
</dependency>
Fügen Sie einfach die @Relation zu Ihrer vorhandenen Entität hinzu und die erforderliche dynamische Beziehungseinheit wird generiert. Dynamische Beziehungen arbeiten nur mit Classed zusammen, die mit @Entity kommentiert sind!
@ Relation ( sourceClass = Person . class )
@ Entity
@ Getter
@ Setter
public class Person implements RelationIdentity {
@ Id
@ GeneratedValue ( strategy = GenerationType . IDENTITY )
private Long id ;
@ Override
public String getType () {
return "PersonType" ;
}
}Implementieren Sie die Beziehung, jede dynamische Beziehung benötigt eine lange ID und einen String -Typ, den Sie definieren können.
@ Relation ( sourceClass = Person . class )
@ Entity
@ Getter
@ Setter
public class Person implements RelationIdentity {
@ Id
@ GeneratedValue ( strategy = GenerationType . IDENTITY )
private Long id ;
@ Override
public String getType () {
return "PersonType" ;
}
}Importieren Sie die DRMConfig in Ihre Spring -Boot -Anwendung, damit Sie den Relationsservice verwenden können
@ SpringBootApplication
@ Import ( DrmConfig . class )
public class App {
public static void main ( String [] args ) {
SpringApplication . run ( App . class , args );
}
} @ Autowired
private RelationService relationService ;
void createRelation () {
Person person = new person ();
personDao . save ( person );
Dog dog = new Dog ();
dogDao . save ( dog );
//Dynamic Relation can only be created with persisted Entities!
RelationLink relationLinkPersonToDog = relationService . createRelation ( person , dog );
}Dynamische Beziehung kann nur mit anhaltenden Einheiten geschaffen werden!
@ Autowired
private RelationService relationService ;
void deleteRelation () {
relationService . deleteRelation ( relationToBeDeleted );
} @ Autowired
private RelationService relationService ;
void findRelations () {
Person person = new person ();
personDao . save ( person );
Dog dog = new Dog ();
dogDao . save ( dog );
Document document = new Document ();
documentDaio . save ( document );
//Dynamic Relation can only be created with persisted Entities!
RelationLink relationLinkPersonToDog = relationService . createRelation ( person , dog );
RelationLink relationLinkPersonToDocument = relationService . createRelation ( person , document );
RelationLink relationLinkDogToDocument = relationService . createRelation ( dog , document );
//Return 1 Relation person -> dog
RelationLink foundRelation = relationService . findRelationBySourceObjectAndRelationIdentity ( person , dog );
//Returns 2 Relations person -> dog and person -> document
List < RelationLink > relationBySourcePerson = relationService . findRelationBySourceObject ( person );
//Returns 2 Relations from person -> document and dog -> document
Set < RelationLink > relationByTargetDocument = relationService . findRelationByTargetRelationIdentity ( document );
} @ Autowired
private RelationService relationService ;
void getSourceObject () {
RelationLink foundRelation = relationService . findRelationBySourceObjectAndRelationIdentity ( person , dog );
//Can be cast to Person because we know it is from Person.class
Person sourceObject = ( Person ) foundRelation . getSourceObject ();
}Jeder Beitrag ist willkommen. Bitte befolgen Sie die Beitragsrichtlinien
Siehe unseren Verhaltenskodex