JPA pretvarači atributa

1. Uvod

U ovom ćemo kratkom članku pokriti upotrebu pretvarača atributa dostupnih u JPA 2.1 - koji nam, jednostavno rečeno, omogućuju mapiranje JDBC tipova u Java klase.

Kao našu provedbu JPA ovdje ćemo koristiti Hibernate 5.

2. Izrada pretvarača

Pokazat ćemo kako implementirati pretvarač atributa za prilagođenu Java klasu.

Prvo, izradimo a PersonName klasa - koja će se kasnije pretvoriti:

javna klasa PersonName implementira Serializable {private String name; private String prezime; // geteri i postavljači}

Zatim ćemo dodati atribut tipa PersonName do an @ Entitet razred:

@Entity (name = "PersonTable") javna klasa Person {private PersonName personName; // ...}

Sada moramo stvoriti pretvarač koji transformira PersonName atribut stupcu baze podataka i obrnuto. U našem ćemo slučaju atribut pretvoriti u Niz vrijednost koja sadrži i imena i prezimena.

Učiniti tako moramo napomenuti našu pretvaračku klasu s @Konverter i provesti AttributeConverter sučelje. Parametrirat ćemo sučelje s vrstama klase i stupcem baze podataka, tim redoslijedom:

@Converter javna klasa PersonNameConverter implementira AttributeConverter {private static final String SEPARATOR = ","; @Override public String convertToDatabaseColumn (PersonName personName) {if (personName == null) {return null; } StringBuilder sb = novi StringBuilder (); if (personName.getSurname ()! = null &&! personName.getSurname () .isEmpty ()) {sb.append (personName.getSurname ()); sb.append (SEPARATOR); } if (personName.getName ()! = null &&! personName.getName (). isEmpty ()) {sb.append (personName.getName ()); } return sb.toString (); } @Override public PersonName convertToEntityAttribute (String dbPersonName) {if (dbPersonName == null || dbPersonName.isEmpty ()) {return null; } Niz [] komada = dbPersonName.split (SEPARATOR); if (pieces == null || pieces.length == 0) {return null; } PersonName personName = novo ime Person (); String firstPiece =! Komada [0] .isEmpty ()? komada [0]: null; if (dbPersonName.contens (SEPARATOR)) {personName.setSurname (firstPiece); if (pieces.length> = 2 && pieces [1]! = null &&! pieces [1] .isEmpty ()) {personName.setName (pieces [1]); }} else {imeName.setName (firstPiece); } vratiti personName; }}

Primijetite da smo morali primijeniti 2 metode: convertToDatabaseColumn () i convertToEntityAttribute ().

Dvije metode se koriste za pretvaranje iz atributa u stupac baze podataka i obrnuto.

3. Korištenje pretvarača

Da bismo koristili naš pretvarač, samo moramo dodati @Pretvoriti napomenu atributa i navedite klasu pretvarača koju želimo koristiti:

@Entity (name = "PersonTable") javna klasa Osoba {@Convert (converter = PersonNameConverter.class) private PersonName personName; // ...}

Na kraju, kreirajmo jedinstveni test kako bismo vidjeli da li stvarno djeluje.

Da bismo to učinili, prvo ćemo pohraniti a Osoba objekt u našoj bazi podataka:

@Test javna praznina givenPersonName_whenSaving_thenNameAndSurnameConcat () {String name = "name"; String prezime = "prezime"; PersonName personName = novo PersonName (); personName.setName (ime); personName.setSurname (prezime); Osoba osoba = nova osoba (); person.setPersonName (personName); Long id = (Long) session.save (person); session.flush (); session.clear (); }

Dalje, testirat ćemo da PersonName je pohranjen onako kako smo ga definirali u pretvaraču - dohvaćanjem tog polja iz tablice baze podataka:

@Test public void givenPersonName_whenSaving_thenNameAndSurnameConcat () {// ... String dbPersonName = (String) session.createNativeQuery ("select p.personName from PersonTable p where p.id =: id") .setParameter ("id", id). getSingleResult (); assertEquals (prezime + "," + ime, dbPersonName); }

Isprobajmo i pretvorbu iz vrijednosti pohranjene u bazi podataka u PersonName klasa radi kako je definirano u pretvaraču pisanjem upita koji dohvaća cjelinu Osoba razred:

@Test javna praznina givenPersonName_whenSaving_thenNameAndSurnameConcat () {// ... Person dbPerson = session.createNativeQuery ("select * from PersonTable p where p.id =: id", Person.class) .setParameter ("id", id) .getSingleRes. (); assertEquals (dbPerson.getPersonName () .getName (), name); assertEquals (dbPerson.getPersonName () .getSurname (), prezime); }

4. Zaključak

U ovom kratkom vodiču pokazali smo kako koristiti novo predstavljene pretvarače atributa u JPA 2.1.

Kao i uvijek, puni izvorni kod za primjere dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found