JPA Référentiel / Service de conception avec les clés primaires composites

J'ai conçu ces tables de base de données:

  1. "article" avec "materialID" comme clé primaire.
  2. "fournisseur" avec "n ° fournisseur" comme clé primaire.
  3. "approvisionnement" avec "materialID" et "n ° de fournisseur" comme clé primaire composite (y compris les relations de clé étrangère pour les tableaux 1 et 2).

Maintenant, je veux traiter avec eux au Printemps à l'aide de JPA. Tout d'abord, je vais présenter l'approche de travail pour les entités "article" et "fournisseur".

Classe d'entité:

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

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

JpaRepository pour l'entité:

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

De la fourniture de services de transactions à l'utilisateur:

@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;
}

Malheureusement, ce système ne semble pas fonctionner correctement pour les "achats" de l'entité.
J'ai déjà lu à propos de la clé primaire composite défi et a écrit cette classe d'entité.

@Entity
@Table
public class Procurement implements Serializable {

private static final long serialVersionUID = 4976268749443066505L;

@EmbeddedId
private ProcId pk;

La classe de l'embedded id ressemble à ceci.

@Embeddable
public class ProcId implements Serializable {

private String materialID;

private int supplierID;
}

Sont l'entité et les classes d'identité correcte? Quelqu'un a une idée de comment changer le référentiel /service afin de travailler avec la clé primaire composite?

Non, le PK n'est pas correctement mis en œuvre. Pourquoi ne pas vous faire le plus simple ET droit ET plus efficaces chose: utiliser une colonne unique, généré automatiquement la clé primaire de l'entité de passation des Marchés, comme pour les deux autres?
Si je le fais de cette façon, il sera toujours possible de chercher efficacement à la fois un materialID et un n ° de fournisseur dans les Achats table?
Pourquoi ne serait-il pas? L'utilisation d'une simple requête JPQL, et assurez-vous de disposer d'une base de données de l'index sur [materialID, n ° de fournisseur].

OriginalL'auteur PWillms | 2013-04-06