Arian
Arian

Reputation: 7719

Exception thrown when having multiple relations between two entities

I have two classes that have 2 relations between them.

User class:

@Entity
@Table(name="User")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="Id")
    private long id;

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="admin")
    private Set<Group> ownedGroup;

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="members")
    private Set<Group> memberGroups;

    //.......
}

Group class:

@Entity
@Table(name="Group")
public class Group implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="Id")
    private long id;

    @NotNull
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="Admin", referencedColumnName="Id")
    private User admin;

    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name = "Group_User", 
        joinColumns = @JoinColumn(name = "Group"), 
        inverseJoinColumns = @JoinColumn(name = "User"))
    private Set<User> members;
    //....
}

When I want to start the App, I get this exception:

org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.myproject.model.User.memberGroups[com.querydsl.core.group.Group]

I saw other similar posts, but apparently they didn't use javax.persistence.Entity and it was the root cause of this error. Any idea how to resolve this issue ?

Upvotes: 1

Views: 63

Answers (1)

Group is a reserved keyword. Use backtick to escape a reserved keyword. Check out this answer.

@Table(name = "`Group`")

Also your @ManyToMany mapping is unfortunately not correct. Update your Group entity like so :

@Entity
@Table(name="`Group`") // Change your table name
public class Group implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="Id")
    private long id;

    @NotNull
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="Admin", referencedColumnName="Id")
    private User admin;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
        name = "Group_User", 
        joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"), //Give a column name 'group_id' and map it to Group primary key id
        inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id") //Give a column name 'user_id' and map it to User primary key id.
    )
    private Set<User> members;

    ...

}

Upvotes: 1

Related Questions