在我的資料庫中,我有users、roles和classifications表。一個用戶可以擁有一個角色和一個分類。這些表不包含任何外鍵。相反,我有兩個連接表;user_roles和user_classifications。這些表中的每一行都將user_id與role_id和classification_id聯系起來。這是最好的,因為同一個角色/分類可以被分配給多個獨特的用戶。這樣就不需要有多條具有相同角色/分類的行,但有不同的外鍵指向用戶。
roles和classifications表相對簡單,一個id列和name列,名稱是一個VARCHAR型別。我有一個Spring應用程式,其中UserRepository擴展了JpaRepository,并且User模型包含javax.persistence注釋。這里是:
@Entity
@Table(name = "users")
public class User {
@Id
private String id;
//...其他欄位在此。
@OneToOne
@JoinTable(
name = "user_classifications",
joinColumns = @JoinColumn(
name = "user_id",
referencedColumnName = "id"
),
inverseJoinColumns = @JoinColumn(
name = "cassification_id",
referencedColumnName = "id"
))
private Classification分類。
@OneToOne
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(
name = "user_id",
referencedColumnName = "id"
),
inverseJoinColumns = @JoinColumn(
name = "role_id",
referencedColumnName = "id"
))
private Role角色。
//...模型的其余部分。
}
@Entity
@Table(name = "角色")
public class Role {
@Id
private String id;
@Column(name = "role_name")
private String name;
}
@Entity
@Table(name = "classifications")
public class Classification {
@Id
private String id;
@Column(name = "classification_name")
private String name;
}
最初,role和classification欄位是String型別。但Jpa并不喜歡這樣,因為它希望映射到一個反映各自表的物件。所以為了讓Jpa高興,我為Role和Classification創建了額外的POJO。這很有效,我可以看到從Jpa回傳的物件,包括id和name欄位。問題是,我的前端期望的是字串型別。我可以修改前端來 "檢查 "回傳的模型,只保留相關的字串資料(名字)。我不得不想象,我在這里錯過了什么,簡單地從物件中設定字串值是可能的。我覺得我在谷歌上搜索答案時問錯了問題。我希望通過在這里解釋我的情況,能得到更好的結果。非常感謝您的幫助。
uj5u.com熱心網友回復:
這并沒有真正回答你的問題,但它也會解決你的問題。 在你的,我想,REST API中使用物體是絕對不建議的。你應該保持你的核心模型的定義,因為根據你的商業案例,它更有意義。然后,您應該將這個基于物體的核心模型映射到 DTO,以最適合消費您的 API 的人的需求的方式來組織這個模型。
盡管如此,您應該嘗試將您的物體與您在 API 中提供的模型解耦。這將使您能夠改變您的核心模型,并保持您的 API 模型不受影響。或者反過來說。因此,我強烈建議你創建一個適合你的消費者需求的API模型,并將你的物體映射到這個模型上。
uj5u.com熱心網友回復:
正如 Jo?o Dias 所建議的,您應該使用 DTO,我認為這是 Blaze-Persistence 物體視圖的一個完美用例。
我創建了這個庫,以允許在 JPA 模型和自定義介面或抽象類定義的模型之間進行輕松的映射,這類似于類固醇的 Spring Data Projections。我們的想法是,您可以按照您喜歡的方式定義您的目標結構(領域模型),并通過JPQL運算式將屬性(getters)映射到物體模型。
你的用例的DTO模型可以像下面這樣使用Blaze-Persistence物體視圖:
public interface UserDto {
字串 getId()。
查詢是一個將物體視圖應用于查詢的問題,最簡單的就是按id查詢。
UserDto a = entityViewManager.find(entityManager, UserDto.class, id);
Spring Data集成允許你幾乎像Spring Data Projections一樣使用它。https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
Page<UserDto> findAll(Pageable pageable)。
最好的部分是,它將只獲取實際需要的狀態!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327145.html
標籤:
