Hallo ich bin dabei ein Photo Album App zu programmieren.
Kurz zur Idee :
hier die Stelle wo die Bilder aus dem Verzeichnis gelesen und in eine Photo Item gebaut werden :
Ich hoffe, der Code ist einigermaßen verstädnis.
Die zeile var savedPhotoAlbum = repository.save(photoAlbum); führt dann zu einer Excepption :
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: my.photoalbum.photoItem.PhotoItem
Der Fehler tritt im folgenden Fall auf :
Wenn das PhotoAlbum 2 gespeichert werden soll tritt der Fehler auf.
Ich hoffe ihr konntet einigermaßen nachvollziehen, was ich meine und habt evtl eine Idee wie ich das Problem lösen kann
Kurz zur Idee :
- Das Programm soll aus einem Verzeichnis jpg Bilder auszulesen und daraus Meta Data zu ermittel und in einem PhotoItem zu speichern. Dieses PhotoItem soll dann in einem PhotoAlbum Object abgespeichert werden.
Java:
@AllArgsConstructor
@NoArgsConstructor
@Builder(setterPrefix = "with")
@Getter
@Entity
@Table(name = "PHOTO_ITEM")
@ToString
public class PhotoItem implements Item {
@Id
@GeneratedValue
@Column(updatable = false)
private long ID;
@NonNull
@Builder.Default
private String hashValue = Strings.EMPTY;
@NonNull
@OneToOne(cascade = CascadeType.ALL)
private PhotoMetaData metaData;
@NonNull
@OneToOne(cascade = CascadeType.ALL)
private PhotoLocation location;
}
Java:
@AllArgsConstructor
@NoArgsConstructor
@Builder(setterPrefix = "with")
@Getter
@Entity
@Table(name = "PHOTO_METADATA")
@ToString
public class PhotoMetaData implements DatabaseEntity {
@Id
@GeneratedValue
@Column(updatable = false)
private long ID;
private int height;
private int width;
@NonNull
@Builder.Default
private String creationTimeStampAsString = Strings.EMPTY;
private double latitude;
private double longitude;
}
Java:
@AllArgsConstructor
@NoArgsConstructor
@Builder(setterPrefix = "with")
@Getter
@Entity
@Table(name = "PHOTO_LOCATION")
@ToString
public class PhotoLocation implements Location {
@Id
@GeneratedValue
@Column(updatable = false)
private long ID;
@NonNull
@Builder.Default
private String country = Strings.EMPTY;
@NonNull
@Builder.Default
private String city = Strings.EMPTY;
@NonNull
@Builder.Default
private String postCode = Strings.EMPTY;
@NonNull
@Builder.Default
private String street = Strings.EMPTY;
@NonNull
@Builder.Default
private String houseNumber = Strings.EMPTY;
}
Java:
@AllArgsConstructor
@NoArgsConstructor
@Builder(setterPrefix = "with", toBuilder = true)
@Getter
@Entity
@Table(name = "PHOTO_ALBUM")
@ToString
public class PhotoAlbum implements Album {
@Id
@GeneratedValue
@Column(updatable = false)
private long ID;
@NonNull
@Builder.Default
private String name = Strings.EMPTY;
@NonNull
@Singular
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<PhotoItem> albumItems;
}
hier die Stelle wo die Bilder aus dem Verzeichnis gelesen und in eine Photo Item gebaut werden :
Java:
var photoFiles = FileUtils.listFiles(new File(sourceFolder), new String[] { "jpg" }, true);
var photoItems = Sets.newHashSet(photoFiles.stream().map(photoItemService::buildPhotoItem).toList());
var photoAlbum = PhotoAlbum.builder()
.withName(photoAlbumName)
.withAlbumItems(photoItems)
.build();
var existingPhotoAlbum = getIfExists(photoAlbumName);
if (existingPhotoAlbum.isPresent()) {
log.info("{}", kv("existing photo album", photoAlbum));
var existingPhotoItems = existingPhotoAlbum.get().getAlbumItems();
photoAlbum = photoAlbum.toBuilder()
.withAlbumItems(existingPhotoItems)
.build();
}
var savedPhotoAlbum = repository.save(photoAlbum);
log.info("{}", kv("saved photo album", savedPhotoAlbum));
return savedPhotoAlbum;
Ich hoffe, der Code ist einigermaßen verstädnis.
Die zeile var savedPhotoAlbum = repository.save(photoAlbum); führt dann zu einer Excepption :
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: my.photoalbum.photoItem.PhotoItem
Der Fehler tritt im folgenden Fall auf :
Code:
var photoAlbumName = "TestPhotoAlbum";
var service = new PhotoAlbumService(repository, photoItemService);
var photoAlbum1 = service.buildAndSavePhotoAlbum(photoAlbumName,
Paths.get("src", "test", "resources", "TestPhotoAlbum", "Album1").toString());
var photoAlbum2 = service.buildAndSavePhotoAlbum(photoAlbumName,
Paths.get("src", "test", "resources", "TestPhotoAlbum", "Album2").toString());
Wenn das PhotoAlbum 2 gespeichert werden soll tritt der Fehler auf.
Ich hoffe ihr konntet einigermaßen nachvollziehen, was ich meine und habt evtl eine Idee wie ich das Problem lösen kann