我對我的物體的建模方式有疑問。來吧,我在資料庫中有一個表,用于保存系統中的檔案,該表具有列 id、fk_id(元素外鍵)、fk_table(物體名稱)和 file_name(存盤我的檔案名)。
在在這里發布我的問題之前我做了很多研究,但我沒有找到任何相關的東西,我的物體、用戶、患者和醫生會是什么?
D B:
| ID | fk_id | fk_table | 檔案名 |
|---|---|---|---|
| 1 | 21 | 用戶 | 測驗1.jpg |
| 2 | 32 | 醫生 | 測驗2.pdf |
| 3 | 61 | 用戶 | 測驗10.pdf |
| 4 | 100 | 病人 | 測驗5.jpg |
班級:
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String LastName;
// What would a one-to-many relationship look like?
}
public class patient{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
// What would a one-to-many relationship look like?
}
uj5u.com熱心網友回復:
您可以使用@Where. 但請注意,這@Where是一個 Hibernate 注釋。它不在 JPA 標準中。
例如在 User 物體中:(我假設您的表映射到一個名為 Document 的物體)
@Where( clause = "fk_table = 'user'")
@JoinColumn(name = "fk_id")
@OneToMany
private List<Document> documents = new ArrayList<>( );
uj5u.com熱心網友回復:
以下僅基于標準 JPA 注釋。這個想法是為檔案表創建一個繼承層次結構。基礎是:
@Entity
@Table(name = "XX_DOCUMENT")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "fk_table")
public abstract class BaseDocument {
@Id
@GeneratedValue(strategy=SEQUENCE)
private Long id;
@Column(name = "file_name")
private String fileName;
}
在這里,我們定義所有擴展它的物體都將進入同一個表,并帶有fk_table要區分的列。擴展它的物體定義如下:
@Entity
@DiscriminatorValue("doctor")
public class DoctorDocument extends BaseDocument {
@ManyToOne
@JoinColumn(name = "fk_id")
private Doctor doctor;
}
@Entity
@DiscriminatorValue("patient")
public class PatientDocument extends BaseDocument {
@ManyToOne
@JoinColumn(name = "fk_id")
private Patient patient;
}
// and so on
有趣的是,我們正在重用該列fk_id來指向正確的表。從一個小實驗來看,Hibernate 似乎沒有問題。為了安全起見,我建議您以另一種方式管理資料庫創建。
, etc 不需要有一個共同的基類,例如Doctor:Patient
@Entity
@Table(name = "XX_DOCTOR")
public class Doctor {
@Id
@GeneratedValue(strategy=SEQUENCE)
private Long id;
@OneToMany(mappedBy = "doctor")
private Collection<DoctorDocument> documents = new ArrayList<>();
// any doctor-specific fields
}
@Entity
@Table(name = "XX_PATIENT")
public class Patient {
@Id
@GeneratedValue(strategy=SEQUENCE)
private Long id;
@OneToMany(mappedBy = "patient")
private Collection<PatientDocument> documents = new ArrayList<>();
// any patient-specific fields
}
// and so on
您可以從相關集合中閱讀(醫生、患者……)的檔案。您甚至可以BaseDocument根據任何條件查詢實體。
您甚至可以繼續使用 Java 代碼做更多精彩的事情。例如定義一個介面HasDocuments:
public interface HasDocuments<D extends BaseDocument> {
Collection<D> getDocuments();
}
Doctor, Patient, ..., 實作了這一點,所以它們都可以被以同樣的方式對待。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/421018.html
標籤:
