Błąd z relacjami tabel - Spring JPA/Hibernate

Odpowiedz Nowy wątek
2015-02-20 23:28
0

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.

Pozostało 580 znaków

2015-02-21 11:11
0

o_O
Avatar w User ma @ManyToOne(cascade = CascadeType.REMOVE)
User w Avatar ma @OneToOne(cascade = CascadeType.REMOVE)
No to jak wreszcie? o_O


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-21 12:15
0

Chodzi o to, że wiele użytkowników może mieć ten jeden avatar, natomiast uploader jest zawsze jeden

Pozostało 580 znaków

2015-02-21 18:11
0

Już sobie z tym poradziłem :)
Problem polegał na tym że w do danego pola klasy nie mogą być przypisanie jednocześnie adnotacje @Column i @JoinColum. Zostawiłem @JoinColumn i nazwę kolumny w danej tabeli zdefiniowałem za pomocą parametru referencedColumnName w adnotacji @JoinColumn.
Po modyfikacjach kod wygląda tak:

    @ManyToOne(cascade = CascadeType.REMOVE)
    @JoinColumn(name = "avatar_id")
    private Avatar avatar;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0