Skip to content
Advertisement

Relationship mapping in Hibernate Java – save owning side entity

I have 2 tables

  • User
  • Url

I’m trying to create a relationship between said 2 tables. A user can have many urls, but a url can belong to only one user.

This sounds to me like a OneToMany relationship.

My User Entity is as follows(some code was removed as to not make it too long):

public class User{

    @OneToMany(
            mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    private final List<RssUrl> rssUrls = new ArrayList<>();

    public void addRssUrl(RssUrl rssUrl) {
        rssUrls.add(rssUrl);
        rssUrl.setUser(this);
    }

    public void removeComment(RssUrl rssUrl) {
        rssUrls.remove(rssUrl);
        rssUrl.setUser(null);
    }

My Url Entity is as follows(some code was removed as to not make it too long):

public class RssUrl {
    @ManyToOne(fetch = FetchType.LAZY)
    private User user;

I’ve been following a relatively simple guide which I’ve found here.

Now my question is: How do I save the owning side entity?

Say I already have a user created.

User user = getCurrentUserDetails();

I add a new url for that user

user.addRssUrl(rssUrl);

And now what?

I’ve tried

    User user = getCurrentUserDetails();
    user.addRssUrl(rssUrl);
    rssUrlRepository.save(rssUrl);

But that results in an errror:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

Of course, I could be going about this all wrong, perhaps my relationship is not correct to begin with?

I’m very open to ideas.

Advertisement

Answer

You configure the relation between User and Url correctly. It mainly complains when it saves an Url , its User is a new record.

The problem can be fixed if you save the User first :

 User user = getCurrentUserDetails();
 user.addRssUrl(rssUrl);

 userRepository.save(user);
 rssUrlRepository.save(rssUrl);

But since you already configure cascade is ALL for User ‘s Url , all JPA operations applied on User will automatically applied to its Url too , which means you can simply do :

 User user = getCurrentUserDetails();
 user.addRssUrl(rssUrl);

 userRepository.save(user);
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement