Ei ole isoisäsi Spring myöskään enää!

Jep, Spring Framework on tosiaan uudistunut rajusti. Ajattelin jatkaa sepustusta siitä mitä Spring Boot projektilla voi tehdä. Tein jo aiemmin perus web projektin jossa on RESTful web service. Tällä kertaa sukelletaan Spring data pakettiin.

Lisää projektiisi riippuvuudet:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.hsqldb</groupId>
  <artifactId>hsqldb</artifactId>
  <scope>runtime</scope>
</dependency>

Jep, tässä tuli siis Hibernate, Spring Data JPA, ja Spring ORMS paketit mukana. Ja testikannaksi embedded hsqldb – voi tietysti olla myös derby, tai ihan tuotantokantoja tms. Mutta jostan hyvä aloitella.

Lisätään Entity Object. Spring ei vaadi persistence.xml tiedostoa, vaan oletuksena kaikki paketit pääkonfiguraatiotiedostos alla skannaillaan (Se jossa on @EnableAutoCofiguration) – huomaa tässä sudenkuoppa – jos pistät entityt esim. tuon paketin rinnalle tai yläpuolelle, niitä ei huomioida. Tästä koodista on jätetty paketti pois:

 

@Entity
public class City implements Serializable {

  @Id
  @GeneratedValue
  private Long id;

  @Column(nullable = false)
  private String name;

  @Column(nullable = false)
  private String country;

  protected City() {
    // no-args constructor required by JPA spec
    // this one is protected since it shouldn't be used directly
  }
  public City(String name, String country) {
    this.name = name;
    this.country = country;
  }
  public String getName() {
    return this.name;
  }
  public String getCountry() {
    return this.country;
  }
}

Jep, tätä ei tarvitse rekisteröidä mihinkään. Jos siinä on @MappedSuperclass, @Entity, tai @Embeddable, se huomioidaan automaattisesti. Tätähän pitäisi pystyä vähän manipuloimaan, tallettelemaan kantaan jne. Tehdään rajapinta joka perii CrudRepository kantaluokan:

public interface CityRepository extends CrudRepository<City, Long> {
}

Jep, tosiaan rajapinta. Spring taikoo sen sisään crud metodit automaattisesti. Näin ollen muutetaan meidän Example-luokan REST service esim. tällaiseksi:

@RestController
public class Example {
  @Autowired CityRepository cityRepo;
  @RequestMapping("/")
  String home() {
    City c = new City("Helsinki","Finland");
    cityRepo.save(c);
    return "Hello World2! " + cityRepo.findAll();
  }
}

 

Tuossa kutsutaan cityRepo-luokan (dynaamisesti generoitu rajapinnan pohjalta) save() ja findAll() funktioita jotka ovat automaattisesti olemassa.

No niin, nyt pitäisi vielä luoda tietokanta, datasource, tunnukset, salasanat, sun muut. Paitsi että ei. Yllätyitkö? Spring Boot olettaa että näihin muistinvaraisiin temp kantoihin ei tarvitse luoda datasourceja, tai määritellä sen enempiä tietoja. Riittää että määrittelit riippuvuuden aiemmin. Toisin sanoen voit heti testata sovellusta kunhan olet pudottanut sen sopivaan tomcat serveriin. REST palvelun pitäisi nyt joka kerralla luoda uusi City-olio ja listata se ruudulla.

Aika ketterää. Paljon olisi taas mitä voisi nyt säätää kun alkuun päästiin:

Spring Data antaa mahdollisuuden määritellä lisää kyselyitä suoraan rajapintaan, näin:

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndCountryAllIgnoringCase(String name, String country);

}

Kun haluat siirtyä testikannasta pysyvämpään testikantaan tai tuotantoon, voit määritellä sen datasource-määritykset application.properties tiedostossa, esim. projektin juuressa:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driverClassName=com.mysql.jdbc.Driver

Muista toki myös tuoda se dependencynä pom.xml tiedostossa – jotta saat ajuritkin mukaan.

Kanta luodaan automaattisesti vain H2, HSQL, ja Derby kannalle. Jos haluat sen muillekin, aseta em application.properties tiedostossa ominaisuus päälle:

spring.jpa.hibernate.ddl-auto=create-drop

Muutenkin voit säätää näitä jpa-määrityksiä samaan tapaan:

spring.jpa.database: H2
spring.jpa.show-sql: true

Lisäksi jos pistät luokkapolun juureen tiedoston nimeltä import.sql, sen sisältämät lauseet suoritetaan sovelluksen käynnistyessä – loistava tapa ladata init/testidata sisään. Sen ohella Spring imaisee tiedostot schema.sql, data.sql, ja esim. schema-${platform}.sql ja data-${platform}.sql, ottaen arvonsa spring.datasource.platform muuttujasta.

Advertisements

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s