En cada base de datos relacional, siempre debe saber qué relaciones son posibles para sus entidades. Pero a veces estas relaciones son desconocidas o pueden cambiar en cualquier momento. Con las relaciones dinámicas, puede agregar o eliminar relaciones personalizadas entre las entidades durante el tiempo de ejecución.
Una relación dinámica se puede ver como un gráfico dirigido con una entrada fija (fuente de outas) y una salida dinámica (objetivo).
diagrama de flujo LR
subgraph Dynamicrelación
Dirección LR
SourceObject-> objetivo
fin
Por ejemplo, con las siguientes entidades:
Una persona puede tener un perro y ambas entras podrían tener documentos (documentos de información de la persona y documentos de información del perro). Ahora podría agregar relaciones dinámicas a todas las entidades que podrían verse así:
gráfico TD;
Persona-> perro;
Persona-> persona_document
Perro-> dog_document;
Cada conexión es una relación dinámica y se generarán las siguientes relaciones:
Cada relación obtuvo un objetivo dinámico, eso significa que podría crear una relación con cualquier otra entidad.
En este escenario, una persona tiene un perro y ambos obtuvieron documentos, ahora podría cambiar la relación durante el tiempo de ejecución (sin alterar sus entidades o modelos). Por ejemplo, podría eliminar una persona_document (se perdió):
gráfico TD;
Persona-> perro;
Perro-> dog_document;
<dependency>
<groupId>io.github.Mom0aut</groupId>
<artifactId>dynamic-relations</artifactId>
<version>1.0.4</version>
</dependency>
Simplemente agregue el @relation a su entidad existente y se generará la entidad de relaciones dinámicas necesarias. ¡Las relaciones dinámicas solo funcionan con clasificadas que se anotan con @Entity !
@ 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" ;
}
}Implemente la RelationIdentidad, cada relación dinámica necesita una ID larga y un tipo de cadena que puede definir.
@ 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" ;
}
}Importe el DrmConfig en su aplicación Spring Boot, para que pueda usar el servicio RelationService
@ 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 );
}¡La relación dinámica solo se puede crear con entidades persistidas!
@ 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 ();
}Cada contribución es bienvenida, siga las pautas de contribución
Vea nuestro código de conducta