すべてのリレーショナルデータベースでは、エンティティにどの関係が可能かを常に把握する必要があります。しかし、時にはこれらの関係が不明であるか、いつでも変わる可能性があります。動的な関係を使用すると、ランタイム中にエンティティ間のカスタム関係を追加または削除できます。
動的な関係は、固定入力(SourceObject)と動的出力(ターゲット)を備えた指向グラフとして見ることができます。
フローチャートLR
サブグラフの動的リレーション
方向LR
sourceObject->ターゲット
終わり
たとえば、次のエンティティで:
人は犬を飼うことができ、両方のエンティテが文書(人情報文書と犬情報文書)を持つことができます。これで、このように見える可能性のあるすべてのエンティティに動的な関係を追加できます。
グラフTD;
人 - >犬;
人 - > person_document
犬 - > dog_document;
各接続は動的な関係であり、次の関係が生成されます。
各関係には動的なターゲットがあります。つまり、他のエンティティとの関係を作成できます。
このシナリオでは、人が犬を飼っていて、両方とも文書を手に入れました。これで、ランタイム中に関係を変更できます(エンティティやモデルの変更はありません)。たとえば、person_documentを削除することができます(迷子になります):
グラフTD;
人 - >犬;
犬 - > dog_document;
<dependency>
<groupId>io.github.Mom0aut</groupId>
<artifactId>dynamic-relations</artifactId>
<version>1.0.4</version>
</dependency>
既存のエンティティに @relationを追加するだけで、必要な動的関係エンティティが生成されます。ダイナミックリレーションは、 @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" ;
}
}関係のアイデンティティを実装します。各動的関係には、定義できる長いIDと文字列タイプが必要です。
@ 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" ;
}
}Spring BootアプリケーションにDRMCONFIGをインポートして、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 );
}動的関係は、永続的なエンティティでのみ作成できます!
@ 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 ();
}すべての貢献を歓迎します。貢献ガイドラインに従ってください
私たちの行動規範を参照してください