Kratul
Kratul

Reputation: 158

Can't remove entity with JPA

I'm trying to remove an entity from memory (at the moment I don't use DB) with JPA, when I use remove and then try to find the deleted entity it shows null, but when I use findAll method it retrieve all data (with removed entity)...

Profile.java

@Entity
@Table(name = "profile")
public class Profile {

    @Id
    @GeneratedValue
    private Long id;

    private String nombre;

    private Boolean restrictedAccess;

    private Boolean canValidate;

    // private Set<AccessField> accessFields = new HashSet<AccessField>();

    // private Set<AccessEntity> accessEntities = new HashSet<AccessEntity>();
    @OneToMany(mappedBy = "profile", fetch = FetchType.EAGER)
    private Set<AccessMenu> menuSections = new HashSet<AccessMenu>();

    @OneToMany(mappedBy = "profile", fetch = FetchType.EAGER)
    private Set<User> users = new HashSet<User>();
[getters and setters]

ProfileRepository

@Repository
@Transactional
public class ProfileRepository {
    @PersistenceContext
    private EntityManager entityManager;

    public Profile save(Profile p) {
        p = this.entityManager.merge(p);
        this.entityManager.flush();
        return p;
    }

    public void delete(Long id){
        Profile profile = this.entityManager.find(Profile.class, id);
        this.entityManager.remove(profile);
    }

    public List<Profile> findAll() {
        CriteriaQuery cq = this.entityManager.getCriteriaBuilder().createQuery();
        cq.select(cq.from(Profile.class));
        return (List<Profile>) this.entityManager.createQuery(cq).getResultList();
    }

    public Profile findById(Long id){
        return this.entityManager.find(Profile.class, id);
    }
}

Controller method

@RequestMapping(value="profile/delete/{idProfile}", method = RequestMethod.GET)
    public String delete(@PathVariable String idProfile,RedirectAttributes ra, Model model){


        profileRepo.delete(Long.valueOf(idProfile));

        model.addAttribute("profiles", profileRepo.findAll());

        return "profile/list";
    }

Upvotes: 3

Views: 3733

Answers (2)

Kratul
Kratul

Reputation: 158

At last I found a solution, the problem was when I tried to remove Profile, users and menuSections have related data, so finally I put in menuSections a cascade = CascadeType.REMOVE and in users set profile property to null

Upvotes: 0

SerhatCan
SerhatCan

Reputation: 590

if you are are trying to delete an entity by using Id in the controller, do it like profileRepo.deleteById(Long.valueOf(idProfile)); this, not like this profileRepo.delete(profileRepo.findById(Long.valueOf(idProfile)));

Also use your repository functions like these,

public void deleteArtistById(Long artistId) {
    Artist artist = manager.find(Artist.class, artistId);
    if (artist != null) {
        manager.getTransaction().begin();
        manager.remove(artist);
        manager.getTransaction().commit();
    }
}


public void deleteArtist(Artist artist) {
    manager.getTransaction().begin();
    manager.remove(artist);
    manager.getTransaction().commit();
}

You can take a look at this link for more detail: http://kodejava.org/how-do-i-delete-entity-object-in-jpa/

Upvotes: 1

Related Questions