jpa
Grundläggande kartläggning
Sök…
parametrar
| Anteckning | detaljer |
|---|---|
@Id | Markerar fält / kolumn som enhetens nyckel |
@Basic | Märken begärde fältet att mappas som en grundtyp . Detta är tillämpligt på primitiva typer och deras omslag, String , Date och Calendar . Annoteringen är faktiskt valfri om inga parametrar anges, men bra stil skulle föreskriva att dina avsikter är tydliga. |
@Transient | Fält markerade som övergående anses inte för uthållighet, precis som det transient nyckelordet för serialisering. |
Anmärkningar
Det måste alltid finnas en standardkonstruktör, det vill säga den parameterlösa. I det grundläggande exemplet angavs ingen konstruktör, så Java lägger till en; men om du lägger till en konstruktör med argument måste du också lägga till den parameterlösa konstruktören.
En mycket enkel enhet
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Basic
int count;
}
Getters, seters etc. utelämnas för korthet, men de behövs inte för JPA ändå.
Denna Java-klass skulle kartlägga till följande tabell (beroende på din databas, här anges i en möjlig Postgres-mappning):
CREATE TABLE Note (
id integer NOT NULL,
note text,
count integer NOT NULL
)
JPA-leverantörer kan användas för att generera DDL och kommer sannolikt att producera DDL som skiljer sig från den som visas här, men så länge typerna är kompatibla kommer detta inte att orsaka problem vid körning. Det är bäst att inte lita på automatisk generation av DDL.
Utelämnar fältet från kartläggningen
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Transient
String parsedNote;
String readParsedNote() {
if (parsedNote == null) { /* initialize from note */ }
return parsedNote;
}
}
Om din klass behöver fält som inte ska skrivas till databasen, markera dem som @Transient . Efter att ha läst från databasen kommer fältet att vara null .
Kartlägga tid och datum
Tid och datum finns i ett antal olika typer i Java: Det nu historiska Date och Calendar , och den nyare LocalDate och LocalDateTime . Och Timestamp , Instant , ZonedLocalDateTime och Joda-tidstyperna. På databasesidan har vi time , date och timestamp (både tid och datum), eventuellt med eller utan tidszon.
Datum och tid före Java 8
Standardkartläggningen för pre-Java-8-typerna java.util.Date , java.util.Calendar och java.sql.Timestamp är timestamp i SQL; för java.sql.Date är 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;
}
Detta kartlägger perfekt till följande tabell:
CREATE TABLE times (
id integer not null,
timestamp timestamp,
sqldate date,
utildate timestamp,
calendar timestamp
)
Detta kan inte vara avsikten. Till exempel används ofta ett Java- Date eller en Calendar för att endast representera datumet (för födelsedatum). Om du vill ändra standardkartläggningen eller bara för att göra kartläggningen tydlig kan du använda @Temporal anteckningen.
@Entity
class Times {
@Id
private Integer id;
@Temporal(TemporalType.TIME)
private Date date;
@Temporal(TemporalType.DATE)
private Calendar calendar;
}
Den motsvarande SQL-tabellen är:
CREATE TABLE times (
id integer not null,
date time,
calendar date
)
Obs 1: Den typ som anges med @Temporal påverkar DDL-generationen; men du kan också ha en kolum av date till Date med bara @Basic kommentaren.
Obs 2: Calendar kan inte endast bestå time .
Datum och tid med Java 8
JPA 2.1 definierar inte stöd för java.time typer som tillhandahålls i Java 8. De flesta av JPA 2.1-implementeringarna erbjuder dock stöd för dessa typer, men det är strikt talade leverantörstillägg.
För DataNucleus fungerar dessa typer helt enkelt ut ur lådan och erbjuder ett brett utbud av kartläggningsmöjligheter, @Temporal kommentaren.
För Hibernate, om de använder Hibernate 5.2+ bör de gå ur rutan, bara använda @Basic kommentaren. Om du använder Hibernate 5.0-5.1 måste du lägga till beroendet org.hibernate:hibernate-java8 . De tillhandahållna kartläggningarna är
-
LocalDatedate -
Instant,LocalDateTimeochZonedDateTimetilltimestamp
Ett säljare-neutralt alternativ skulle också vara att definiera en JPA 2.1 AttributeConverter för alla Java 8- java.time typer som krävs för att kvarstå.
Enhet med sekvenshanterad id
Här har vi en klass och vi vill att identitetsfältet ( userUid ) ska få sitt värde genererat via en SEKVENS i databasen. Denna SEQUENCE antas kallas USER_UID_SEQ och kan skapas av en DBA eller kan skapas av JPA-leverantören.
@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;
}