orm for Cassandra with query-driven modelling approach
main idea in abstracting from "creating table" and instead writing queries for whom library will create tables via whom queries will be executed effectively. you need only create scheme via POJOs, then generate classes, whom will help you write queries
also library introduce "lazy migration" approach, which might be helpfull in certain situations
example of usage - https://github.com/Nutrymaco/orm-test-project
(it won't be typical one-class-example)
- Start with defining configuration
you need implement interface Configuration
import com.nutrymaco.orm.config.Configuration;
public class OrmConfiguration implements Configuration {
@Override
public String packageName() {
return "com.nutrymaco.project";
}
@Override
public boolean enableSynchronisation() {
return false;
}
}
- Define entities via POJO
import com.nutrymaco.orm.generator.annotations.Entity;
@Entity
public class Movie {
@Unique
int id;
String name;
int year;
List<Actor> actors;
}
@Entity
public class Actor {
@Unique
int id;
String name;
List<Movie> movies;
Organisation organisation;
City city;
}
@Entity
public class City {
@Unique
int id;
int count;
String name;
}
@Entity
public class Organisation {
@Unique
int id;
String name;
List<Actor> actors;
City city;
}
- Generate helper classes
they will be generated in packages : fields, records and repository
import com.nutrymaco.orm.generator.MainGenerator;
public class Generate {
public static void main(String[] args) {
MainGenerator.generate();
}
}
- Write queries
you can just define method or explicitly write query via Query
import com.nutrymaco.orm.generator.annotations.Repository;
@Repository
public interface MovieRepository {
List<MovieRecord> getByYear(int year);
default List<MovieRecord> getByActorName(String actorName) {
return Query.select(MOVIE_ENTITY)
.where(MOVIE.ACTOR.NAME.eq(actorName))
.fetchInto(MovieRecord.class);
}
}
- Run queries
import com.nutrymaco.orm.query.generation.RepositoryProvider;
public class Main {
public static void main(String[] args) {
MovieRepository repository = RepositoryProvider.from(MovieRepository.class);
repository.getByYear(2018).stream()
.map(movie -> "Name : " + movie.name())
.forEach(System.out::println);
repository.getByActorName("Christian Bale").stream()
.map(movie -> "Name : " + movie.name())
.forEach(System.out::println);
}
}