2013-04-06 19 views
3

我設計了以下數據庫表:JPA存儲庫/ Service設計與複合主鍵

  1. 「製品」與「materialID」作爲主鍵。
  2. 「supplier」以「supplierID」作爲主鍵。
  3. 將「materialID」和「supplierID」作爲複合主鍵(包括與表1和表2的外鍵關係)的「採購」。

現在我想用JPA在Spring中處理它們。首先,我將演示爲實體「文章」和「供應商」工作的方法。

實體類:

@Entity 
public class Article { 
@Id 
private String materialID; 

@Column(nullable = false) 
private String shortText; } 

JpaRepository的實體:

@Repository 
public interface IArticleRepository extends JpaRepository<Article, String> 
{ 
List<Article> findByShortTextLike(String shortText); //just another search method 
} 

服務提供交易用戶:

@Service 
public class ArticleService implements IArticleService { 

@Autowired 
private IArticleRepository articleRepository; 

@Override 
@Transactional(readOnly = true) 
public Article getArticleByID(String id) { 
return this.articleRepository.findOne(id); 
} 

@Override 
@Transactional 
public Article createArticle(String id, String shortText) { 
Article article = new Article(); 
article.setMaterialID(id); 
article.setShortText(shortText); 
this.articleRepository.save(article); 
return article; 
} 

不幸的是,這個系統似乎不能正常工作爲「採購」實體。 我已經閱讀了關於複合主鍵挑戰並寫了這個實體類。

@Entity 
@Table 
public class Procurement implements Serializable { 

private static final long serialVersionUID = 4976268749443066505L; 

@EmbeddedId 
private ProcId pk; 

嵌入ID的類看起來像這樣。

@Embeddable 
public class ProcId implements Serializable { 

private String materialID; 

private int supplierID; 
} 

實體和id類是否正確?有沒有人有想法如何更改存儲庫/服務以使用複合主鍵?

+0

沒有,PK不正確實施。爲什麼不做更簡單,正確,更高效的事情:爲採購實體使用單列自動生成的主鍵,就像其他兩個主鍵一樣? – 2013-04-06 11:13:08

+0

如果我這樣做,是否仍然可以在Procurement表中高效地搜索materialID和supplierID? – PWillms 2013-04-06 11:30:43

+0

爲什麼不呢?使用簡單的JPQL查詢,並確保在[materialID,supplierID]上有一個數據庫索引。 – 2013-04-06 11:38:31

回答

1

ProcId應該這樣定義:

@Embeddable 
public class ProcId implements Serializable { 
    @ManyToOne(optional = false) 
    private Article article; 
    @ManyToOne(optional = false) 
    private Supplier supplier; 
} 
+0

終於得到了我的解決方案上面的工作,但我會考慮你的建議。我還找到了關於該主題的「知識數據庫」:http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced – PWillms 2013-04-06 16:26:17