Я пытаюсь связать классы Spring Boot Model с таблицами MySQL. Но при связывании классов модели Spring возникает исключение. Пожалуйста, посмотрите на мой код.
Во-первых, ниже находится файл application.properties:
application.properties
spring.thymeleaf.cache = false
spring.thymeleaf.prefix = classpath:/templates
server.port = 8090
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost/test?characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = password
######################################################
##### Configure Hibernate DDL mode: create / update
spring.jpa.properties.hibernate.hbm2ddl.auto = update
spring.jpa.properties.hibernate.show_sql = true
######################################################
##### Spring Security Queries for AuthenticationManagerBuilder
spring.queries.users-query = SELECT username, password, active FROM user_table WHERE username=?
spring.queries.roles-query = SELECT ut.username, rt.role FROM user_table ut inner join user_role ur on(ut.user_id=ur.user_id) inner join role_table rt on(ur.role_id=rt.role_id) WHERE ut.username=?
Класс пользователя
@Data
@Entity
@Table(name="USER_TABLE")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="USER_ID", nullable = false, unique = true)
private Long id;
@Column(name="EMAIL", unique=true, nullable=false)
@Email
@NotEmpty(message="**Type your email")
private String email;
@Column(name="PASSWORD", nullable=false)
@Length(min=5, message="**minimum 5 characters")
@NotEmpty(message="**type password")
@JsonIgnore
private String password;
@Column(name="USERNAME", unique=true, nullable=false)
@Length(min=3, message="**minimum 3 characters")
@NotEmpty(message="**type your username")
private String username;
@Column(name="NAME")
@NotEmpty(message="**type your name")
private String name;
@Column(name="LAST_NAME")
@NotEmpty(message="**type your last name")
private String lastName;
@Column(name="ACTIVE", nullable=false)
private int active;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="USER_ROLE", joinColumns=@JoinColumn(name="USER_ID"), inverseJoinColumns=@JoinColumn(name="ROLE_ID"))
private Collection<Role> roles;
@OneToMany(mappedBy="user")
private Collection<Post> posts;
}
Почтовый класс
@Data
@Entity
@Table(name="POST")
public class Post {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="POST_ID")
private Long id;
@Column(name="TITLE", nullable=false)
@Length(min=5, message="**minimum 5 characters")
@NotEmpty(message="**type your title")
private String title;
@Column(name="BODY", columnDefinition="TEXT")
private String body;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="CREATION_DATE", nullable=false, updatable=false)
@CreationTimestamp
private Date createDate;
@ManyToOne
@JoinColumn(name="USER_ID", referencedColumnName="USER_ID", nullable=false)
@NotNull
private User user;
@OneToMany(mappedBy="post", cascade=CascadeType.REMOVE)
private Collection<Comment> comments;
}
Класс роли
@Data
@Entity
@Table(name="ROLE_TABLE")
public class Role {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="role_id")
private Long id;
@Column(name="role", unique=true)
private String role;
@ManyToMany(cascade=CascadeType.ALL, mappedBy="roles")
private Collection<User> users;
}
Однако метод post.setUser вообще не работает и выдает проводные сообщения об ошибках. Ниже приведен метод контроллера, который содержит метод post.setUser.
@Controller
public class PostController {
@Autowired
private PostService postService;
@Autowired
private UserService userService;
@RequestMapping(value="/newPost", method=RequestMethod.GET)
public String newPost(Principal principal, Model model) {
User user = userService.findByUsername(principal.getName());
if(user != null) {
Post post = new Post();
post.setUser(user); // throws Exceptions.
model.addAttribute("post", post);
return "/postForm";
} else {
return "/error";
}
}
@RequestMapping(value="/newPost", method=RequestMethod.POST)
public String createNewPost(@Valid Post post, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
return "/postForm";
} else {
postService.save(post);
return "redirect:/blog/" + post.getUser().getUsername();
}
}
Исключения
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:473) ~[na:na]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at com.aaa.spring.blog.model.Role.toString(Role.java:16) ~[classes/:na]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:473) ~[na:na]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at com.aaa.spring.blog.model.User.toString(User.java:25) ~[classes/:na]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:168) ~[na:na]
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:473) ~[na:na]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
Я скачал этот код по этой ссылке . Но я боюсь, что этот код имеет некоторые ошибки. Я пытаюсь найти ошибки, но не могу найти ошибки для изменения.