JPA-Repository / Service design mit composite primary keys

Habe ich die folgende Datenbank-Tabellen:

  1. "Artikel" mit "materialID" als primary key.
  2. "Lieferant" mit "supplierID" als primary key.
  3. "Beschaffung" mit "materialID" und "supplierID" als zusammengesetzten Primärschlüssel (inklusive foreign-key-Beziehungen zu den Tabellen 1 und 2).

Nun möchte ich mit Ihnen in den Frühling mit JPA. Zuerst werde ich zeigen die Vorgehensweise für die Entitäten "Artikel" und "Lieferant".

Entity-Klasse:

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

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

JpaRepository für das Unternehmen:

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

Service providing Transaktionen für den Benutzer:

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

Leider, dieses system funktioniert anscheinend nicht ordnungsgemäß für die "Beschaffung" aufgenommen werden.
Ich habe schon gelesen über die zusammengesetzten Primärschlüssel Herausforderung an und schrieb das entity-Klasse.

@Entity
@Table
public class Procurement implements Serializable {

private static final long serialVersionUID = 4976268749443066505L;

@EmbeddedId
private ProcId pk;

Die Klasse der eingebetteten id sieht wie folgt aus.

@Embeddable
public class ProcId implements Serializable {

private String materialID;

private int supplierID;
}

Sind die entity-und die Klassen-id korrekt? Hat jemand eine Idee wie man das ändern das repository /- service, um die Arbeit mit dem zusammengesetzten Primärschlüssel?

Nein, die PK ist nicht korrekt implementiert. Warum gehst du nicht den einfacheren und rechts UND effizienter Sache: mit einer einzigen Spalte, automatisch generierten Primärschlüssel für die Beschaffung Einheit, wie für die beiden anderen?
Wenn ich es genau so machen, wird es dennoch möglich sein, effizient suchen, die für beide eine materialID und ein supplierID in der Beschaffung Tabelle?
Warum würde nicht es sein? Verwenden Sie eine einfache JPQL Abfrage, und stellen Sie sicher, dass Sie eine Datenbank-index auf [materialID, supplierID].

InformationsquelleAutor PWillms | 2013-04-06

Schreibe einen Kommentar