Zoeken…
parameters
| aantekening | Details |
|---|---|
@Id | Markeert veld / kolom als de sleutel van de entiteit |
@Basic | Markeringen aangevraagd veld toegewezen als basistype . Dit is van toepassing op primitieve typen en hun omslagen, String , Date en Calendar . De annotatie is eigenlijk optioneel als er geen parameters worden opgegeven, maar een goede stijl zou dicteren om uw bedoelingen expliciet te maken. |
@Transient | Velden gemarkeerd als tijdelijk worden niet in aanmerking genomen voor persistentie, net als het transient sleutelwoord voor serialisatie. |
Opmerkingen
Er moet altijd een standaardconstructor zijn, dat wil zeggen de parameterloze. In het basisvoorbeeld was er geen constructor opgegeven, dus heeft Java er een toegevoegd; maar als u een constructor met argumenten toevoegt, moet u ook de parameterloze constructor toevoegen.
Een heel eenvoudige entiteit
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Basic
int count;
}
Getters, setters etc. zijn weggelaten vanwege de beknoptheid, maar ze zijn toch niet nodig voor JPA.
Deze Java-klasse wordt toegewezen aan de volgende tabel (afhankelijk van uw database, hier gegeven in een mogelijke Postgres-toewijzing):
CREATE TABLE Note (
id integer NOT NULL,
note text,
count integer NOT NULL
)
JPA-providers kunnen worden gebruikt om de DDL te genereren en zullen waarschijnlijk DDL anders produceren dan de hier getoonde, maar zolang de typen compatibel zijn, zal dit geen problemen veroorzaken tijdens runtime. Het is het beste om niet te vertrouwen op het automatisch genereren van DDL.
Veld weglaten van de afbeelding
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Transient
String parsedNote;
String readParsedNote() {
if (parsedNote == null) { /* initialize from note */ }
return parsedNote;
}
}
Als uw klas velden nodig heeft die niet naar de database moeten worden geschreven, markeer ze dan als @Transient . Na het lezen uit de database is het veld null .
Tijd en datum in kaart brengen
Tijd en datum zijn er in Java op verschillende manieren: de nu historische Date en Calendar en de recentere LocalDate en LocalDateTime . En Timestamp , Instant , ZonedLocalDateTime en de Joda-time types. Aan de databasezijde hebben we time , date en timestamp (zowel tijd als datum), mogelijk met of zonder tijdzone.
Datum en tijd vóór Java 8
De standaardtoewijzing voor de pre-Java-8-typen java.util.Date , java.util.Calendar en java.sql.Timestamp is timestamp in SQL; voor java.sql.Date is het date .
@Entity
class Times {
@Id
private Integer id;
@Basic
private Timestamp timestamp;
@Basic
private java.sql.Date sqldate;
@Basic
private java.util.Date utildate;
@Basic
private Calendar calendar;
}
Dit komt perfect overeen met de volgende tabel:
CREATE TABLE times (
id integer not null,
timestamp timestamp,
sqldate date,
utildate timestamp,
calendar timestamp
)
Dit is misschien niet de bedoeling. Vaak wordt bijvoorbeeld een Java- Date of Calendar gebruikt om alleen de datum weer te geven (voor de geboortedatum). Als u de standaardtoewijzing wilt wijzigen of alleen om de toewijzing expliciet te maken, kunt u de @Temporal annotatie gebruiken.
@Entity
class Times {
@Id
private Integer id;
@Temporal(TemporalType.TIME)
private Date date;
@Temporal(TemporalType.DATE)
private Calendar calendar;
}
De equivalente SQL-tabel is:
CREATE TABLE times (
id integer not null,
date time,
calendar date
)
Opmerking 1: het type dat is opgegeven met @Temporal beïnvloedt het genereren van DDL; maar je kunt ook een kolom van het type date tot Date met alleen de @Basic annotatie.
Opmerking 2: de Calendar kan de time alleen vasthouden.
Datum en tijd met Java 8
JPA 2.1 geen ondersteuning voor definiëren java.time soorten die in Java 8. De meeste PPV 2,1 implementaties bieden ondersteuning voor deze typen maar hoewel deze strikt genomen vendor extensies.
Voor DataNucleus werken deze typen gewoon uit de doos en bieden een breed scala aan @Temporal , gekoppeld aan de @Temporal annotatie.
Voor Hibernate moeten ze, als ze Hibernate 5.2+ gebruiken, meteen werken, alleen met de @Basic annotatie. Als u Hibernate 5.0-5.1 gebruikt, moet u de afhankelijkheid org.hibernate:hibernate-java8 . De verstrekte toewijzingen zijn
-
LocalDatetot opdate -
Instant,LocalDateTimeenZonedDateTimenaartimestamp
Een verkoper-neutraal alternatief zou ook zijn om een JPA 2.1 AttributeConverter te definiëren voor elk Java 8 java.time type dat moet worden java.time .
Entiteit met reeksbeheerde id
Hier hebben we een klasse en we willen dat het identiteitsveld ( userUid ) zijn waarde genereert via een SEQUENCE in de database. Deze SEQUENCE wordt verondersteld USER_UID_SEQ te worden genoemd en kan worden gemaakt door een DBA of kan worden gemaakt door de JPA-provider.
@Entity
@Table(name="USER")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="USER_UID_GENERATOR", sequenceName="USER_UID_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_UID_GENERATOR")
private Long userUid;
@Basic
private String userName;
}