جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی


امکانی در JPA 2.1 معرفی شده که میتوان نوع داده دیتابیس را به نوع داده جاوایی تبدیل کرد 


کلاس زیر را در نظر بگیرید :


public class PersonName implements Serializable {
 
    private String name;
    private String surname;
 
    // getters and setters
}


که خود این کلاس یکی از فیلد های کلاس entity زیر را تشکیل میدهد :


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


حالا به یک تبدیل کننده نیاز داریم که PersonName را به نوع داده دیتابیس تبدیل کند و بالعکس 

فرض کنید که یک column از نوع String داریم که name و surname در آن ذخیره میشود 


ابتدا نیاز به ایجاد یک کلاس مبدل Converter@ داریم که از اینترفیس AttributeConverter پیاده سازی کرده باشد و شامل دو متد اصلی است:


@Converter
public class PersonNameConverter implements
  AttributeConverter<PersonName, String> {
 
    private static final String SEPARATOR = ", ";
 
    @Override
    public String convertToDatabaseColumn(PersonName personName) {
        if (personName == null) {
            return null;
        }
 
        StringBuilder sb = new 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;
        }
 
        String[] pieces = dbPersonName.split(SEPARATOR);
 
        if (pieces == null || pieces.length == 0) {
            return null;
        }
 
        PersonName personName = new PersonName();        
        String firstPiece = !pieces[0].isEmpty() ? pieces[0] : null;
        if (dbPersonName.contains(SEPARATOR)) {
            personName.setSurname(firstPiece);
 
            if (pieces.length >= 2 && pieces[1] != null
              && !pieces[1].isEmpty()) {
                personName.setName(pieces[1]);
            }
        } else {
            personName.setName(firstPiece);
        }
 
        return personName;
    }
}


برای استفاده از این کلاس مبدل در Entity آنرا به فیلد مورد نظر معرفی میکنیم :


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



و آنرا تست میکنیم :


ابتدا یک Entity ذخیره میکنیم

@Test
public void givenPersonName_whenSaving_thenNameAndSurnameConcat() {
    String name = "name";
    String surname = "surname";
 
    PersonName personName = new PersonName();
    personName.setName(name);
    personName.setSurname(surname);
 
    Person person = new Person();
    person.setPersonName(personName);
 
    Long id = (Long) session.save(person);
 
    session.flush();
    session.clear();
}


سپس آنرا دریافت و با مقادیر اولیه مقایسه میکنیم :


@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(surname + ", " + name, dbPersonName);
}
@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(), name);
    assertEquals(dbPerson.getPersonName()
      .getSurname(), surname);
}









نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی