Skip to content
Snippets Groups Projects
Commit 5a5c387f authored by opitzju's avatar opitzju
Browse files

letzter Bug behoben

parent 10fe4a99
Branches
No related tags found
No related merge requests found
...@@ -32,10 +32,10 @@ public class Movie { ...@@ -32,10 +32,10 @@ public class Movie {
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private MovieType type; private MovieType type;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "movie", fetch = FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, mappedBy = "movie", fetch = FetchType.EAGER, orphanRemoval = true)
private Set<MovieCharacter> characters; private Set<MovieCharacter> characters;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE}, targetEntity = Genre.class)
@JoinTable(name = "MovieGenre", joinColumns = @JoinColumn(name = "MovieID"), @JoinTable(name = "MovieGenre", joinColumns = @JoinColumn(name = "MovieID"),
inverseJoinColumns = @JoinColumn(name = "GenreID")) inverseJoinColumns = @JoinColumn(name = "GenreID"))
private Set<Genre> genres; private Set<Genre> genres;
......
...@@ -29,7 +29,7 @@ public class MovieCharacter { ...@@ -29,7 +29,7 @@ public class MovieCharacter {
@Column(name = "Position") @Column(name = "Position")
private Integer position; private Integer position;
@ManyToOne(cascade = CascadeType.MERGE) @ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name = "Actor") @JoinColumn(name = "Actor")
private Person actor; private Person actor;
......
...@@ -8,6 +8,7 @@ import jakarta.persistence.criteria.CriteriaQuery; ...@@ -8,6 +8,7 @@ import jakarta.persistence.criteria.CriteriaQuery;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer; import java.util.function.Consumer;
...@@ -22,15 +23,12 @@ public class Manager<T> { ...@@ -22,15 +23,12 @@ public class Manager<T> {
this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
} }
protected List<T> queryNoClose(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) { protected List<T> query(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) {
var manager = getEntityManager(); var manager = getEntityManager();
var cb = manager.getCriteriaBuilder(); var cb = manager.getCriteriaBuilder();
var cq = cb.createQuery(type); var cq = cb.createQuery(type);
function.accept(cb, cq); function.accept(cb, cq);
return manager.createQuery(cq).getResultList(); var result = manager.createQuery(cq).getResultList();
}
protected List<T> query(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) {
var result = queryNoClose(function);
closeEntityManager(); closeEntityManager();
return result; return result;
} }
...@@ -61,9 +59,16 @@ public class Manager<T> { ...@@ -61,9 +59,16 @@ public class Manager<T> {
protected <E> E mergeIfDetached(E entity) { protected <E> E mergeIfDetached(E entity) {
var manager = getEntityManager(); var manager = getEntityManager();
if (!manager.contains(entity)) if (!manager.contains(entity)) {
return manager.merge(entity); return manager.merge(entity);
}
return entity; return entity;
} }
protected Optional<T> find(Object id) {
if (id == null)
return Optional.empty();
return Optional.ofNullable(getEntityManager().find(type, id));
}
} }
...@@ -31,13 +31,15 @@ public class MovieManager extends Manager<Movie> { ...@@ -31,13 +31,15 @@ public class MovieManager extends Manager<Movie> {
return movies.stream().map(mapper::map).collect(Collectors.toList()); return movies.stream().map(mapper::map).collect(Collectors.toList());
} }
public void insertUpdateMovie(final MovieDTO movieDTO) { public void insertUpdateMovie(final MovieDTO dto) {
Optional<Movie> movie = movieDTO.getId() == null ? Optional.empty() : findMovieById(movieDTO.getId()); if (dto == null)
return;
Optional<Movie> movie = find(dto.getId());
updateMapper(); updateMapper();
if (movie.isPresent()) if (movie.isPresent())
update(movie.get(), movieDTO); update(movie.get(), dto);
else else
insert(movieDTO); insert(dto);
closeEntityManager(); closeEntityManager();
} }
...@@ -53,11 +55,15 @@ public class MovieManager extends Manager<Movie> { ...@@ -53,11 +55,15 @@ public class MovieManager extends Manager<Movie> {
} }
private void update(Movie movie, MovieDTO dto) { private void update(Movie movie, MovieDTO dto) {
doTransaction(manager -> mapper.deepUnmapOn(dto, mergeIfDetached(movie))); doTransaction(manager -> {
manager.detach(movie);
mapper.deepUnmapOn(dto, movie);
manager.merge(movie);
});
} }
public void deleteMovie(final long movieId) { public void deleteMovie(final long movieId) {
var movie = findMovieById(movieId); var movie = find(movieId);
movie.ifPresent(this::delete); movie.ifPresent(this::delete);
closeEntityManager(); closeEntityManager();
} }
...@@ -67,16 +73,9 @@ public class MovieManager extends Manager<Movie> { ...@@ -67,16 +73,9 @@ public class MovieManager extends Manager<Movie> {
} }
public MovieDTO getMovie(final long movieId) { public MovieDTO getMovie(final long movieId) {
var movie = findMovieById(movieId); var movie = find(movieId);
closeEntityManager(); closeEntityManager();
return movie.map(mapper::map).orElse(null); return movie.map(mapper::map).orElse(null);
} }
private Optional<Movie> findMovieById(final long id) {
return queryNoClose((cb, cq) -> {
var root = cq.from(Movie.class);
cq.select(root).where(cb.equal(root.get("id"), id));
}).stream().findAny();
}
} }
...@@ -128,6 +128,7 @@ public class TestDB { ...@@ -128,6 +128,7 @@ public class TestDB {
assertEquals(newCharacter.getAlias(), sameCharacter.getAlias()); assertEquals(newCharacter.getAlias(), sameCharacter.getAlias());
assertEquals(newCharacter.getPlayer(), sameCharacter.getPlayer()); assertEquals(newCharacter.getPlayer(), sameCharacter.getPlayer());
characters.remove(sameCharacter); characters.remove(sameCharacter);
assertEquals(1, characters.size());
movieManager.insertUpdateMovie(after); movieManager.insertUpdateMovie(after);
after = movieManager.getMovie(1); after = movieManager.getMovie(1);
characters = after.getCharacters(); characters = after.getCharacters();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment