kostenloser Webspace werbefrei: lima-city


spring jpa hibernate

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    hswlab

    Kostenloser Webspace von hswlab

    hswlab hat kostenlosen Webspace.

    Ich habe mich etwas in Spring und Hibernate eingeschnuppert und gemerkt, dass Such/Filter anfragen mit "findBy.." relativ lange dauern, wenn man eine Suche über mehrere Felder einer richtig gut gefüllten Tabelle macht.

    Der Grund wird vermutlich sein, dass die Felder der Datenbank nicht als Key-Felder deklariert sind. In vielen Beispielen die ich gefunden habe, hat die Tabelle auch nur ein einzelnes @Id Feld in der Entity Klasse.

    Falls bekannt, kann mir jemand ein HowTo mit einem guten Beispiel zum performanten Suchen/Filtern einer großen Datenbanktabelle empfehlen? Es sollte nicht nur beschrieben sein, wie man ein find(id) auf ein einzelnes Id-Feld macht. Davon habe ich schon Beispiele gefunden :-)

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Was bedeutet "gut gefüllt"? 1.000 Einträge? 10.000 Einträge? 100.000 Einträge?

    Lädst du ggf. Relationships mit, weil diese nicht als FetchType.LAZY markiert wurden? Hast du dir mal die generierten SQL-Statements angeschaut?
    Wie genau sieht denn deine bisherige Abfrage aus?

    Beitrag zuletzt geändert: 30.8.2016 13:26:34 von baris1892
  4. Autor dieses Themas

    hswlab

    Kostenloser Webspace von hswlab

    hswlab hat kostenlosen Webspace.

    Mit gut gefüllt meine ich schon sehr umfangreiche Tabellen mit 10.000 bis 100.000 Einträgen.

    Eigentlich benutze ich Lazy bei meinen Attributen. Einfacher wäre es, wenn ich mir ein Beispiel anschaue, wie eine Suche auf eine große Tabelle in Spring richtig aussehen sollte.

    Vielleicht gebe ich einfach mal Demo Entity Klassen und die unimplementierten Repository und Service Klassen an und ein erfahrener Entwickler zeigt, wie diese für eine möglichst performante Suche aussehen müssen? :-)

    Die Ausgabe in der View würde z.B. wie folgt aussehen:

    1. Der User kann nach dem Movie-Namen (Freitext), Genres (Checkbox) und Actors (Checkbox) suchen.

    2. Die Ergebnisliste zeigt pro Zeile den Movie-Namen und die Genre-Tags z.B. Action, Comedy,.. (Ein Film kann mehr als nur einem Genre angehören)

    3. Der Klick auf einen Eintrag aus der Ergebnisliste öffnet die Detailansicht mit allen Infos zum Film, d.h. Actors, Genres, Beschreibungen etc..

    Movie.java
    package test.entity;
    
    @Entity(name = "movie")
    public class Movie {
    
    	@Id
    	@GeneratedValue
    	@Column(name = "movie_id")
    	private Integer movieId;
    
    	@Column(name = "name")
    	private String name;
    
    	@Lob
    	@Type(type = "org.hibernate.type.StringClobType")
    	@Column(name = "description", length = Integer.MAX_VALUE)
    	private String description;
    
    	@ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable
    	private List<Genre> genres;
    
    	@ManyToMany(fetch = FetchType.LAZY)
    	@JoinTable
    	private List<Actor> actors;
    
    	/** Getter/Stetter **/
    
    }


    Genre.java
    package test.entity;
    
    @Entity(name = "genre")
    public class Genre {
    
    	@Id
    	@GeneratedValue
    	@Column(name = "genre_id")
    	private Integer genreId;
    
    	@Column(name = "name")
    	private String name;
    
    	@Column(name = "description")
    	private String description;
    
    	@ManyToMany(mappedBy = "genres", fetch = FetchType.LAZY)
    	private List<Movie> movies;
    
    	/** Getter/Setter **/
    }


    Actor.java
    package test.entity;
    
    @Entity(name = "actor")
    public class Actor {
    
    	@Id
    	@GeneratedValue
    	@Column(name = "actor_id")
    	private Integer actorId;
    
    	@Column(name = "name")
    	private String name;
    
    	@Column(name = "description")
    	private String description;
    
    	@ManyToMany(mappedBy = "actors", fetch = FetchType.LAZY)
    	private List<Movie> movies;
    
    	/** Getter/Setter **/
    }


    MovieRepository.java
    package test.repository;
    
    public interface MovieRepository extends JpaRepository<Movie, Integer> { 
    	/* TODO */
    }


    GenreRepository.java
    public interface GenreRepository extends JpaRepository<Genre, Integer> {
    	/* TODO */
    }


    ActorRepository.java
    public interface ActorRepository extends JpaRepository<Actor, Integer> {
    	/* TODO */
    }


    MovieService.java
    package test.service;
    
    @Service
    @Transactional
    public class MovieService {
    
    	public List<Movie> findByMovieName(String movieName) {
    		// TODO
    	}
    
    	public List<Movie> findByActors(List<Actor> actors) {
    		// TODO
    	}
    
    	public List<Movie> findByGenres(List<Genre> genres) {
    		// TODO
    	}
    
    	public List<Movie> findByActorsAndGenresAndMovieName(List<Actor> actors, List<Genre> genres, String MovieName) {
    		// TODO
    	}
    }
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!