# ManyToOne begrenzen?



## Templarthelast (27. Jun 2012)

Gibt es slqtechnisch eine Möglichkeit die Anzahl der ManyToOne Verknüpfungen zu begrenzen?


----------



## Abc1234 (27. Jun 2012)

Nein


----------



## nillehammer (27. Jun 2012)

Beim JPA-Mapping geht erstmal alles, was auch mit SQL gehen würde. Wenn Du eine 1:n-Beziehung mit SQL-Tables abbildest, wirst Du das mit einem Fremdschlüssel machen. Du kannst in SQL aber beim Erstellen der Tabellen nicht sagen: "Der Fremdschlüssel darf nur 10 Mal vorkommen". Insofern geht das beim Mapping in JPA auch nicht. Diese Anforderung wirst Du also mit Applikationslogik abblilden müssen.

- Wenn es nur darum geht, die Anzahl der Results einer Query zu begrenzen, kannst Du beim Erstellen Deiner Queries die Methode "setMaxResults(length)" nutzen.

- Wenn es darum geht, dass ein Parent eine maximale Anzahl Children haben soll, musst Du das in einer eigenen Methode machen bspw. eine addChild-Methode im Parent, die ungefähr so aussehen könnte:

```
public class Parent

  private static final int MAX_CHILDREN = 10;

  private Set<Child> children;

  ... Getter, Setter, Annotationen etc. ...

  public boolean addChild(final Child child) {

    if (this.children.size() >= MAX_CHILDREN) {
      throw new IllegalArgumentException("Children voll!");
      // Oder UnsupportedOperationException, IllegalStateException, was Du halt am passendsten findest
    }

    return this.children.add(child);
  }
```


----------



## Templarthelast (27. Jun 2012)

An soetwas hatte ich auch schon gedacht. Nur da ich mit meheren Servern gleichzeitig in eine Datenbank schreibe, will ich halt verhindern, dass praktisch gleichzeitig der 10. von 10 Plätzen vollgeschrieben wird und dann plötzlich 11 Einheiten drinn sind. Denn von der Datenbank würde ja das ok zurückkommen: 
	
	
	
	





```
9 von 10 belegt
```

Ich denke ich mache dann die List als festes Array, um so eine Überfüllung zu verhindern.


----------



## nillehammer (27. Jun 2012)

Wären Stored-Procedures eine Option? Dann könntest Du eine Stored-Procedure zum Hinzufügen der Children implementieren, die als erstes einen

```
SELECT COUNT(fremdSchluessel) FROM children WHERE fremdSchluessel = ?
```
macht und bei Überschreiten eines Limits das INSERT nicht ausführt. Damit verhinderst Du natürlich nicht, dass ein unvorsichtiger Programmierer an dieser Procedure vorbei Children mit normalen INSERTs hinzufügt. Aber Dein Applikationscode ist dadurch vielleicht etwas sauberer


----------

