# Unterschied @Id und @Access?



## JavaCat++ (1. Apr 2017)

Guten Morgen,
ich muss michberuflich gerade sehr vielmit JPA beschäftigen und habe nun eine Frage zu @Id und @access.
Ich zitiere einfach mal sinngemäß aus dem Buch:
"Bei dem Zugriff auf die Daten eines Entitys muss zwischen dem Zugriff durch den JPA-Provider und dem Zugriff [...] des Anwendungsentwicklers unterschieden werden. Der JPA-Provider benötigt den Zugriff, um in die Datenbank schreiben zu können und analog um aus der Datenbank lesen und das Entity setzen zu können. Die Zugriffsart wurde in JPA 1.0 nur durch Position des @Id geregelt (entweder am Getter oder am Attribut).
Um einer Unterklasse eine andere Zugriffsart zu ermöglichen, aber auch um den Zugriff zu explizit zu machen, führte JPA 2.0 das@Access ein."

Nun folgendes Listing:


```
@Entity
@Access(AccessType.FIELD)
public class Kunde {
@Id @GeneratedValue
private Integer id;
private String vorname;
Public String nachname;

@access(AccessType.PROPERTY)
public String getVorname() {
return this.name;
}

public STring setVorname (String vorname) {

this.vorname = vorname;
}
```
[...]
(Mehr ist nicht abgebildet)
Nun bin ich verwirrt: Das @Id sagt dem JPA-Provider einmal, dass das Attribut id der Primärschlüssel ist, aber auch auf das Attribute direkt zugreifen kann, ohne über die Setter-Methoden zu gehen (Daher ist keine Setter für die Abgebildet???). Da aber über der Klasse das AccessType.Field steht, wird @Id ja als Zugriff überschrieben und da es über der Klasse steht, kann der JPA-Provider nun alle Attribute direkt, ohne über die Setter und Getter zu gehen, ansprechen?Dies gilt aber nicht für den Getter des Vornames, weil das ein Access.PROPERTY hat.
Oder gilt der Access nur für die erbenen Unterklassen, wegen folgendem Satz "Um einer Unterklasse eine andere Zugriffsart zu ermöglichen, aber auch um den Zugriff zu explizit zu machen, führte JPA 2.0 das@Access ein" (s.o.).

Vielen Dank!


----------



## mrBrown (1. Apr 2017)

@ID und @Access(FIELD) sagen in dem Fall das gleiche aus, Zugriff direkt aufs Feld und nicht über Get/Setter - außer für den Vornamen, weil es da explizit anders angegeben ist.

Eine Unterklasse von Kunde kann (vor JPA 2.0) den Zugriff nicht ändern, da er ja durch das @ID festgelegt ist.
Mit 2.0 kann sowohl die Klasse selbst als auch deren (überschriebenen) Get/setter mit @access annotiert werden, und somit kann es anderen Zugriff als in der Oberklasse geben.


----------



## JavaCat++ (1. Apr 2017)

OK Danke. Nur wie ist es, wenn ich im obigen Beispiel nur das @Id stehen lassen würde und die @access alle entfernen würde? Wie würden dann vor- und nachname angesprochen werden? Ist der Default dann über die getter/setter oder über das Attribut?


----------



## mrBrown (1. Apr 2017)

@access alle entfernen würde? Wie würden dann vor- und nachname angesprochen werden? Ist der Default dann über die getter/setter oder über das Attribut?[/QUOTE]
über die Attribute, da das @Id ja am Attribut steht


----------



## JavaCat++ (1. Apr 2017)

Achso, ich dachte @Id bezieht sich dann nur auf das Attribut id  Dann hat sich auch meine zweite Frage erledigt, dass man @Id auch über der Klasse Kunde hätte schreiben können, so wie es accessType.field macht, um der JPA zu sagen, dass er alles über die Attribute ansprechen kann. Aber so wenn ich jetzt darüber nachdenke, würde das ja auch keinen Sinn machen, dann würde die JPA ja gar nicht, was der Primary Key sein sollte. :/ Ok, ich denke ich habs verstanden.


----------



## mrBrown (1. Apr 2017)

Richtig - ID muss am Attribut oder an der Methode stehen, und das legt den Zugriff fest. Und den Zugriff kann man eben mit @access überschreiben


----------

