Search code examples
imagespring-bootentity

How to define a field for loading multiple images in spring boot model


I am developing an application for vehicle stock tracking system using spring boot, angular and mysql. Multiple images of the vehicle will be loaded from the interface. Normally, when there is only one image, I define a field of type byte [] with @lob annotation. But how can I keep it in the database when more than one image comes in. I think a relational structure is required but I couldn't.

public class User extends BaseEntity{

    @Column(name = "TC_NUM", unique = true)
    @NotNull
    private String tcNum;

    @Column(name = "EMAIL", unique = true)
    @NotNull
    private String email;

    @Column(name = "USERNAME", unique = true)
    @NotNull
    private String username;

    @Column(name = "PASSWORD")
    @NotNull
    private String password;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "User_ROLES",
            joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
    @NotNull
    private Set<Role> roles;


}

Solution

  • Yes, you need to have One to Many relation. Add another db table and entity for vehicle images. Let's say we called it VehicleImage:

    @Entity
    @Table(name="vehicle_image")
    public class VehicleImage{
        @Id
        private Long id;
    
        @Lob
        @Column(name = "image", columnDefinition="BLOB")
        private byte[] image;
    
        @ManyToOne(fetch = FetchType.LAZY)
        private User user;
    
        public VehicleImage() {}
        
        // getters and setters
    }
    

    And add mapping to your User class like that:

    public class User extends BaseEntity{
        @OneToMany(
            mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
        private Set<VehicleImage> vehicleImages;
      
        public void addVehicleImage(VehicleImage vehicleImage) {
            vehicleImages.add(vehicleImage);
            vehicleImage.setUser(this);
        }
     
        public void removeVehicleImage(VehicleImage vehicleImage) {
            vehicleImages.remove(vehicleImage);
            vehicleImage.setUser(null);
        }
    //rest of your class
    
    }
    

    As you can see I've also added two utility methods to User class. For details, see this great post by Vlad Mihalcea -> https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

    Now you can persist your images like that:

    User user = new User();
     
    user.addVehicleImage(
        new VehicleImage (imageBytesArray)
    );
    
    entityManager.persist(user);