2

Spring-data Hibernate などを使用して REST アプリケーションに取り組んでいます。すべての基本的なアクションをセットアップしましたが、今は何か特定のことをしたいと思っています。データベース内の別のテーブルへの外部キーを持つアイテムのリストを取得すると、休止状態はその外部キーの行全体を返します。例えば:

[ {
  "id":1, 
  "school": {"id":1, "name":"De regenboog", password":"800e30e9bb3b82ce955a127650d835d0", "street":"Plantaanstraat", "number":"2", "zipCode":"1234AS", "city":"Amsterdam", "contactName":"Arends", "contactPhoneNumber":"06-45648466", "contactEmail":"arends@regenboog.nl"}, 
  "name":"Groep", 
  "dateCreated":"2012-04-25"
  }
]

(ちなみに全て架空のデータです)

今の問題は、学校が完全に返還されることを望んでいないということです. school_id を表示したいだけです。Web を検索し、「サービス レベル マッピング」に関するいくつかの記事を読みましたが、例を見つけることができませんでした。私は自分のアプリケーションを

コントローラ -> サービス -> dao -> リポジトリ

設定。

皆さんが私を助けてくれることを願っています! (さらにソースコードが必要な場合はお知らせください)。

どうもありがとう

編集

追加したいのは、MySql テーブルが次のようになっていることです。

ID | SCHOOL_ID | 名前 | DATE_CREATED

したがって、私が返したいのは、オブジェクトの学校ではなく、プレーンな school_id だけです(この状況では)

EDIT2 @Dandy の回答に取り組んでおり、現在持っているコードを表示したい:

@ManyToOne
@JoinColumn(name = "SCHOOL_ID")
private School school;

@Column(name = "SCHOOL_ID", insertable = false, updatable = false)
private long schoolId;

public long getSchoolId() {
    return schoolId;
}

public void setSchoolId(long schoolId) {
    this.schoolId = schoolId;
}

public School getSchool() {
    return school;
}

public void setSchool(School school) {
    this.school = school;
}

ダニーが提案したようにコードを変更すると、私が望む結果が得られます..ほとんど。今クエリを実行すると、次のようになります。

[ {
  "id":1, 
  "school": {"id":1, "name":"De regenboog", password":"800e30e9bb3b82ce955a127650d835d0", "street":"Plantaanstraat",  "number":"2", "zipCode":"1234AS", "city":"Amsterdam", "contactName":"Arends", "contactPhoneNumber":"06-45648466", "contactEmail":"arends@regenboog.nl"},    
  "schoolId": 1  
  "name":"Groep", 
  "dateCreated":"2012-04-25"
  }
]

school問題は、この特定のクエリを無効にしたいということです。それは可能ですか?

4

3 に答える 3

3

数日が経ち、自分に合った解決策を見つけました。いくつかの新しいクラス IE SchoolDTO (DTO は Data Transfer Object の略) を作成しました。これらのクラス内では、表示したい値のみをフロント エンドに追加しました。すなわち:

public class ClassesDTO {

    private long id;
    private long schoolId;
    private String schoolName;
    private String name;
    private Date dateCreated;

    //Getters and setters...
}

School オブジェクト全体を表示する代わりに、ID と NAME のみを含めました。このクラス内には、getter と setter のみがあります。次に、元のクラスを新しい DTO クラスにマップするマッパーを作成します。すなわち。

public ClassesDTO mapToDTO(Classes classes) {
    ClassesDTO classesDTO = new ClassesDTO();
    classesDTO.setId(classes.getId());
    classesDTO.setSchoolId(classes.getSchool().getId());
    classesDTO.setSchoolName(classes.getSchool().getName());
    // etc...

次に、サービス レイヤーで、通常の Classes オブジェクトではなく、新しくマップされた DTO オブジェクトをコントローラーに返します。

それだけです。を返す必要がある場合はマッピングもあり、java.util.List学校全体を宣言することなくデータベースにデータを挿入したい場合はその逆です。誰かが私がこれをどのように行ったのか疑問に思っているだけの簡単な例を示します。

public Classes mapFromDTOCreate(ClassesCreateDTO classesCreateDTO){
    Classes classes = new Classes();
    classes.setSchool(schoolDAO.findSchoolById(classesCreateDTO.getSchoolId()));
    classes.setName(classesCreateDTO.getName());
    classes.setDateCreated(classesCreateDTO.getDateCreated());
    return classes;
}

この新しいクラス オブジェクトは DAO に安全に返すことができ、休止状態は ORM (オブジェクト リレーショナル マッピング) の原因であるデータベースに保存できます。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-05-11T20:30:11.340 に答える
2

現在、関係schoolを使用してマップされている可能性があります。<many-to-one>

<many-to-one name="school" class="School">
    <column name="SCHOOL_ID" type="string" />
</many-to-one>

SCHOOL_ID のフィールドをもう 1 つ削除できます。

<property name="schoolId" column="SCHOOL_ID" type="string" insert="false" update="false"/>

注:insert="false" update="false"列が複数回マップされる場合に必要です。

于 2012-05-08T10:34:55.260 に答える
1

@JsonIgnoreJSON シリアル化に (デフォルトの) Jackson マッパーを使用している場合、プロパティをシリアル化したくない場合は、エンティティでプロパティに注釈を付けることができます。

于 2012-05-08T09:55:56.077 に答える