JPA attribútum-átalakítók

1. Bemutatkozás

Ebben a rövid cikkben kitérünk a JPA 2.1-ben elérhető attribútum-átalakítók használatára - amelyek egyszerűen fogalmazva lehetővé teszik számunkra, hogy JDBC típusokat hozzárendeljünk Java osztályokhoz.

Itt a Hibernate 5-öt fogjuk használni JPA megvalósításként.

2. Konverter létrehozása

Megmutatjuk, hogyan lehet egy attribútum-átalakítót megvalósítani egy egyedi Java osztályhoz.

Először hozzunk létre egy SzemélyNév osztály - amelyet később átalakítanak:

public class PersonName megvalósítja a Serializable {private String name; privát String vezetéknév; // szerelők és beállítók}

Ezután hozzáadunk egy típusú attribútumot SzemélyNév egy @Entity osztály:

@Entity (name = "PersonTable") nyilvános osztály Person {private PersonName personName; // ...}

Most létre kell hoznunk egy átalakítót, amely átalakítja a SzemélyNév attribútum egy adatbázis oszlopnak és fordítva. Esetünkben az attribútumot konvertáljuk a-ra Húr a név és a vezetéknév mezőket egyaránt tartalmazó érték.

Ahhoz -val meg kell jegyeznünk a konverter osztályunkat @ Converter és végrehajtja a AttributeConverter felület. Az interfészt az osztály típusaival és az adatbázis oszlopával paraméterezzük, a következő sorrendben:

@Converter public class PersonNameConverter megvalósítja az AttributeConverter {private static final String SEPARATOR = ","; @Orride public String convertToDatabaseColumn (PersonName personName) {if (personName == null) {return null; } StringBuilder sb = új StringBuilder (); if (személynév.getSurname ()! = null &&! személyNév.getSurname () .isEmpty ()) {sb.append (személyNév.getSurname ()); sb.append (SZeparátor); } if (személynév.címNév ()! = null &&! személynév.címNév (). isEmpty ()) {sb.append (személynév.getNév ()); } return sb.toString (); } @Orride public PersonName convertToEntityAttribute (String dbPersonName) {if (dbPersonName == null || dbPersonName.isEmpty ()) {return null; } Karakterlánc [] darab = dbPersonName.split (SEPARATOR); if (darab == null || darab.hossz == 0) {return null; } SzemélyNév személyNév = új SzemélyNév (); String firstPiece =! Darab [0] .isEmpty ()? darabok [0]: null; if (dbPersonName.contains (SEPARATOR)) {personName.setSurname (firstPiece); if (darabok.hossz> = 2 && darab [1]! = null & &! }} else {személyNév.készletNév (első darab); } return personName; }}

Vegye figyelembe, hogy 2 módszert kellett végrehajtanunk: convertToDatabaseColumn () és convertToEntityAttribute ().

A két módszert arra használják, hogy az attribútumból az adatbázis oszlopká konvertálják, és fordítva.

3. Az átalakító használata

Az átalakítónk használatához csak hozzá kell adnunk a @Alakítani jelölést az attribútumhoz, és adja meg a használni kívánt átalakító osztályt:

@Entity (name = "PersonTable") nyilvános osztály Person {@Convert (converter = PersonNameConverter.class) private PersonName personName; // ...}

Végül hozzunk létre egy egység tesztet, hogy lássuk, valóban működik-e.

Ehhez először tároljuk a Személy objektum az adatbázisunkban:

@Test public void givenPersonName_whenSaving_thenNameAndSurnameConcat () {String name = "name"; Karakterlánc vezetéknév = "vezetéknév"; PersonName personName = új PersonName (); personName.setName (név); personName.setSurname (vezetéknév); Személy személy = új Személy (); person.setPersonName (személyNév); Long id = (Long) session.save (személy); session.flush (); session.clear (); }

Ezután teszteljük, hogy a SzemélyNév úgy lett tárolva, ahogy azt a konverterben definiáltuk - a mező lekérésével az adatbázis táblából:

@Test public void givenPersonName_whenSaving_thenNameAndSurnameConcat () {// ... Karakterlánc dbPersonName = (String) session.createNativeQuery ("válassza a p.personName elemet a PersonTable p-ből, ahol p.id =: id") .setParameter ("id", id). getSingleResult (); assertEquals (vezetéknév + "," + név, dbPersonName); }

Teszteljük azt is, hogy az adatbázisban tárolt értékből az SzemélyNév osztály az átalakítóban meghatározottak szerint működik, az egészet lekérdező lekérdezés megírásával Személy osztály:

@Test public void givenPersonName_whenSaving_thenNameAndSurnameConcat () {// ... Person dbPerson = session.createNativeQuery ("select * from PersonTable p where p.id =: id", Person.class) .setParameter ("id", id) .getSingleResult (); assertEquals (dbPerson.getPersonName () .getName (), név); assertEquals (dbPerson.getPersonName () .getSurname (), vezetéknév); }

4. Következtetés

Ebben a rövid bemutatóban bemutattuk, hogyan kell használni az újonnan bevezetett Attribute Convertereket a JPA 2.1-ben.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.