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

letzter Bug behoben

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