2011-09-30 46 views
0

使用ORM中的關係(來自長期項目視圖)的最佳/通用解決方案(最佳實踐)是什麼? 1)例如,可以使用以下物質:我有Oracle HR架構。在可能的每個對象(實體)之間創建關係還是僅在現在我真正需要的對象之間創建關係(以及將來會更改)?使用ORM中的關係

@Entity 
public class Employee { 
    @Id 
    private long employeeId; 
    @ManyToOne((fetch = FetchType.LAZY) 
    private Job job; 
} 

@Entity 
public class Job { 
    @Id 
    private String jobId; 
    @OneToMany(fetch = FetchType.LAZY) 
    private List<Employee> employeeList; 
} 

2)我應該如何使用現有的或新的Job存儲/設置新員工?我們有一個字符串的jobId Employee實體,並創建關係的工作職位變量:

@Entity 
public class Employee { 
    @Id 
    private long employeeId; 
    private String jobId; 
    @ManyToOne((fetch = FetchType.LAZY) 
    private Job job; 
} 

最壞的解決方案設置兩個參數每次:

Job job = new Job(); 
job.setJobId("JOB_01"); 
Employee employee = new Employee(); 
employee.setEmployeeId(1L) 
employee.setJobId(job.getJobId()); 

一點點更好的解決方案是重新實現setJobId()在Employee類方法(應該也有一些代碼,以找出是否提到工作存在與否):

public void setJobId(String jobId) { 
    if (getJob() == null) { 
     this.jobId = jobId; 
     job = new Job(); 
     job.setJobId(jobId); 
    } else { 
     this.jobId = getJob().getJobId(); 
    } 
} 

回答

1

如果你不需要一個協會,那麼你並不需要添加它。但是請注意,即使它沒有直接用於Java代碼中,爲了能夠在JPQL或條件查詢中遍歷它,關聯可能仍然很有用。

關於您的jobId字段,它應該從Employee實體中刪除。一名員工有工作,並且您可以使用employee.getJob().getId()訪問其工作ID。您不應該能夠設置員工的工作ID。相反,您應該獲得或創建一個工作(在服務層),並使用setJob(job)來設置員工的工作。

+0

非常感謝您的回答。 – Ziletka

+0

是否有一些很好的解決方案如何存儲新的員工與現有的工作?因爲當我調用job.setJobId(「AC_ACCOUNT」)和employee.setJob(job)時,系統會嘗試觸摸(存儲新作業或更新現有作業)作業表。 – Ziletka

+1

使用數據庫中的給定ID(使用em.find或em.getReference或session.get或session.load)獲取作業,並在員工中設置此作業。 –