我設計了以下數據庫表:JPA存儲庫/ Service設計與複合主鍵
- 「製品」與「materialID」作爲主鍵。
- 「supplier」以「supplierID」作爲主鍵。
- 將「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類是否正確?有沒有人有想法如何更改存儲庫/服務以使用複合主鍵?
沒有,PK不正確實施。爲什麼不做更簡單,正確,更高效的事情:爲採購實體使用單列自動生成的主鍵,就像其他兩個主鍵一樣? – 2013-04-06 11:13:08
如果我這樣做,是否仍然可以在Procurement表中高效地搜索materialID和supplierID? – PWillms 2013-04-06 11:30:43
爲什麼不呢?使用簡單的JPQL查詢,並確保在[materialID,supplierID]上有一個數據庫索引。 – 2013-04-06 11:38:31