ManyToOneとOneToManyを休止状態で使用しています。場所を持つユーザーを作成したいと考えています。postmanでデータを取得するとき、ユーザーを取得するとユーザーの場所が表示され、場所でユーザーが表示されるため、無限ループになります。ここにコードがあります:
ロケーションクラス:
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name=FLD_LOC, nullable=false)
private Consumer consumers;
public Consumption(String location, float consumpiton,Consumer consumer) {
this.location = location;
this.consumpiton = consumpiton;
this.consumers=consumer;
}
ユーザークラス:
@OneToMany(mappedBy = Consumption.FLD_LOC,orphanRemoval = true)
private List<Consumption> locations ;
public Consumer(String clientId, String name,String location, float pwConsumption, String email, String password, String roles) {
super(clientId, name, email, password, roles);
this.locations=new ArrayList<>();
this.location=location;
this.pwcons=pwConsumption;
}
しかし、データベースでは、usersテーブルに場所の名前を、locationsテーブルにユーザーのIDを格納しています。
これは次のような問題です:
"id": 2,
"version": 1,
"updated": "2020-06-28T15:41:49.082",
"clientId": "admin",
"name": "admin",
"email": "[email protected]",
"password": "$2a$10$hgcTSHjGpxEPg6WNb0U7ouHR5J5YYR5l1XVAejdK8JsG9w2Bko00a",
"active": true,
"roles": "ROLE_ADMIN",
"locations": [
{
"locationsid": 1,
"location": "Pecs",
"consumpiton": 0.0,
"consumers": {
"id": 2,
"version": 1,
"updated": "2020-06-28T15:41:49.082",
"clientId": "admin",
"name": "admin",
"email": "[email protected]",
"password": "$2a$10$hgcTSHjGpxEPg6WNb0U7ouHR5J5YYR5l1XVAejdK8JsG9w2Bko00a",
"active": true,
"roles": "ROLE_ADMIN",
"locations": [
{
"locationsid": 1,
"location": "Pecs",
"consumpiton": 0.0,
"consumers": {
"id": 2,
"version": 1,
"updated": "2020-06-28T15:41:49.082",
"clientId": "admin",
"name": "admin",
"email": "[email protected]",
"password": "$2a$10$hgcTSHjGpxEPg6WNb0U7ouHR5J5YYR5l1XVAejdK8JsG9w2Bko00a",
"active": true,
"roles": "ROLE_ADMIN",
"locations": [
{
"locationsid": 1,
"location": "Pecs",
JSONの場所の部分に場所の名前またはIDのみを表示させるにはどうすればよいですか?
問題
これは、双方向の関係を持つオブジェクトをシリアル化する必要がある場合の一般的な問題です。
解決
双方向の関係に直面したときに停止する場所をシリアライザーに通知する
最初のアプローチは、カスタムDTOを作成し、残りのコントローラーから返すことです。DTOでは、移入されますlocation
のフィールドcustomerDto
でlocationDto
秒が、あなたはなりませセットcustomer
のフィールドをlocationDto
、それがnullになります。
2番目のアプローチはあまり好ましくありません。しかし、とを追加することで@JsonManagedReference
、再帰的にシリアル化しないようにJacksonライブラリに指示できます@JsonBackReference
。
@OneToMany(mappedBy = Consumption.FLD_LOC,orphanRemoval = true)
private List<Consumption> locations ;
with
@OneToMany(mappedBy = Consumption.FLD_LOC,orphanRemoval = true)
@JsonManagedReference
private List<Consumption> locations ;
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name=FLD_LOC, nullable=false)
private Consumer consumers;
with
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name=FLD_LOC, nullable=false)
@JsonBackReference
private Consumer consumers;
注意:
実動システムでは、ドメインオブジェクトのすべてのフィールドを公開するわけではありません。外部に公開してはならない内部フィールドが多数存在する可能性があるためです。それが理由です、最初のアプローチが優先されます
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加