1

Решил добавить связь @ManyToOne в User и @OneToMany в Team после чего в бразере вижу Error 503, а в консоли три ошибки. Старался все делать как в туториалах для создания связей в Entity, но за целый день так и не смогу разобраться.

Ошибки:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/appconfig-data.xml]: Invocatio
n of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory

at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: user, for columns: [org.hibernate.mapping.Column(roles)]

Связи таблиц:

введите сюда описание изображения

User Entity

package com.wwwgame.account.entity;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Set;

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name= "increment", strategy= "increment")
    @Column(name = "id", length = 11, nullable = false)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "email")
    private String email;

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

    private String passwordConfirm;

    private Set<Role> roles;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;

    @Column(name = "created_at")
    private Timestamp createdAt;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Team getTeam() {
        return team;
    }

    public void setTeam(Team team) {
        this.team = team;
    }

    public Timestamp getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Timestamp createdAt) {
        this.createdAt = createdAt;
    }

    @Transient
    public String getPasswordConfirm() {
        return passwordConfirm;
    }

    public void setPasswordConfirm(String passwordConfirm) {
        this.passwordConfirm = passwordConfirm;
    }

    @ManyToMany
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

Team Entity

package com.wwwgame.account.entity;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "team")
public class Team {

    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name= "increment", strategy= "increment")
    @Column(name = "id", length = 11, nullable = false)
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.LAZY)
    private List<User> user = new ArrayList<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<User> getUser() {
        return user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }
}

Role Entity

package com.wwwgame.account.entity;

import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "role")
public class Role {
    private Long id;
    private String name;
    private Set<User> users;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToMany(mappedBy = "roles")
    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}
Gildars
  • 318

2 Answers2

1

Рекомендую рассмотрите данную ссылку, чтобы понять мой ответ:

Ссылка на ПОЛНЫЙ пример аннотаций

А вообще, вот как должны выглядеть ваши сущности:

User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "stockmarkets", "roles")
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(generator = &quot;increment&quot;)
@GenericGenerator(name= &quot;increment&quot;, strategy= &quot;increment&quot;)
@Column(name = &quot;id&quot;, length = 11, nullable = false)
private Long id;

@Column
private String username;

@Column
private String email;

@Column
private String password;

@Transient
private String passwordConfirm;

@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(name = &quot;user_role&quot;,
        joinColumns = { @JoinColumn(name = &quot;user_id&quot;) },
        inverseJoinColumns = { @JoinColumn(name = &quot;role_id&quot;) })
private List&lt;Role&gt; roles = new ArrayList&lt;&gt;();

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = &quot;team_id&quot;)
private Team team;

public void addRole(Role role) {
    roles.add(role);
    role.getUser().add(this);
}

public void removeRole(Roles role) {
    roles.remove(role);
    role.getUser().remove(this);
}

@Column(name = &quot;created_at&quot;)
private Timestamp createdAt;

}

Team.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "users")
@Entity
@Table(name = "team")
public class Team {
@Id
@GeneratedValue(generator = &quot;increment&quot;)
@GenericGenerator(name= &quot;increment&quot;, strategy= &quot;increment&quot;)
@Column(name = &quot;id&quot;, length = 11, nullable = false)
private Long id;

@Column(name = &quot;name&quot;)
private String name;

@OneToMany(
        mappedBy = &quot;professor&quot;,
        cascade = CascadeType.ALL,
        orphanRemoval = true
)
private List&lt;User&gt; users = new ArrayList&lt;&gt;();

/*
Ниже строки - обязательны!! Добавлять объеты только через методы нижу
 */
public void addUser(User user) {
    users.add(user);
    user.setTeam(this);
}

public void removeUser(User user) {
    users.remove(user);
    user.setTeam(null);
}

}

Role.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "users")
@Entity
@Table(name = "role")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
private Long id;

@Column
private String name;

@ManyToMany(mappedBy=&quot;roles&quot;)
private List&lt;User&gt; users = new ArrayList&lt;&gt;();

/*
Ниже строки - не обязательны. Добавлять объеты только через методы нижу
 */

public void addUser(User user) {
    users.add(user);
    user.setRole(this);
}

public void removeUser(User user) {
    users.remove(user);
    user.setRole(null);
}

}

1

Нужно добавить

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;

в класс User.

talex
  • 2,321