Witajcie,
Zaczynam swoją przygodę ze springiem. Aktualnie próbuję pobrać dane z bazy danych za pomocą JPA i Hibernate. Udało mi się to, lecz mam problem gdy potrzebuję zdefiniować jakieś zależności pomiędzy tymi tabelami.
User:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Integer id;
@Column(unique = true)
@Size(min = 6, max = 32, message = "Invalid length of username! Username allowed length 6-32")
private String username;
@Email(message = "Invalid email!")
@Size(min = 3, max = 64, message = "Invalid length of email! Email allowed length 3-64")
private String email;
@Size(max = 2 ^ 16, message = "Description is too long!")
private String description;
@Column(name = "birth_date")
private Date birthDate;
private String password;
@Column(name = "avatar_id")
@JoinColumn(name = "id")
@ManyToOne(cascade = CascadeType.REMOVE)
private Avatar avatar;
public Integer getId() {
return id;
}
public void setId(Integer 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 getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Avatar getAvatar() {
return avatar;
}
public void setAvatar(Avatar avatar) {
this.avatar = avatar;
}
@Override
public String toString() {
return StringUtils.toString(this);
}
}
Avatar:
@Entity
@Table(name = "users_avatars")
public class Avatar {
@Id
@GeneratedValue
private Integer id;
@Column(name = "uploader_id")
private Integer uploaderId;
/* Base64 encoded avatar */
@Size(max = 2 ^ 24)
private String avatar;
@Column(name = "uploader_id")
@JoinColumn(name = "id")
@OneToOne(cascade = CascadeType.REMOVE)
private User uploader;
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUploaderId() {
return uploaderId;
}
public void setUploaderId(Integer uploaderId) {
this.uploaderId = uploaderId;
}
@Override
public String toString() {
return StringUtils.toString(this);
}
}
Tabele
CREATE TABLE IF NOT EXISTS `users` (
`id` INT NULL AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(32) NOT NULL UNIQUE,
`email` VARCHAR(64) NOT NULL,
`password` VARCHAR(64) NOT NULL,
`description` TEXT NULL,
`birth_date` TIMESTAMP NULL,
`avatar_id` INT NULL
);
CREATE TABLE IF NOT EXISTS `users_avatars` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`uploader_id` INT NOT NULL,
`avatar` MEDIUMTEXT CHARACTER SET ascii NOT NULL
);
Błąd:
Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory.
Z tego wynika że pojawia się błąd przy wykonywaniu metody init w obiekcie SessionFactory w hibernate, ale nie wiem dlaczego.