Hibernate игнорирует аннотацию @AttributeOverrides и создает столбцы в неправильной таблице - PullRequest
0 голосов
/ 07 июля 2019

У меня есть 2 таблицы SQL:

Пользователи:

CREATE TABLE users
(
    id BIGINT PRIMARY KEY DEFAULT nextval('global_seq'),

    /* email, password, other fields */

);

Users_avatars:

CREATE TABLE users_avatars
(
    user_id BIGINT NOT NULL,
    file_name VARCHAR,
    file_path VARCHAR,

    FOREIGN KEY (user_id) REFERENCES users (id)
);

Однако, почему я пытаюсь сопоставить его с Hibernate, он создает file_name и file_path внутри таблицы users.

Мои классы следующие:

@Entity
@Table(name = "users")
@SecondaryTable(name = "users_avatars",
        pkJoinColumns = @PrimaryKeyJoinColumn(name = "user_id", referencedColumnName = "id"))
public class User extends EntityWithId
{
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "file_name", column = @Column(table = "users_avatars")),
            @AttributeOverride(name = "file_path", column = @Column(table = "users_avatars"))
    })
    private FileInDb avatar;


    public FileInDb getAvatar()
    {
        return avatar;
    }

    public void setAvatar(FileInDb avatar)
    {
        this.avatar = avatar;
    }
}

И класс FileInDb:

@Embeddable
@MappedSuperclass
public abstract class FileInDb
{
    @Column(name = "file_name")
    @NotNull
    @NotBlank
    private String fileName;

    @Column(name = "file_path")
    @NotNull
    @NotBlank
    private String filePath;

    public String getFileName()
    {
        return fileName;
    }

    public void setFileName(String fileName)
    {
        this.fileName = fileName;
    }

    public String getFilePath()
    {
        return filePath;
    }

    public void setFilePath(String filePath)
    {
        this.filePath = filePath;
    }
}

Сценарий SQL, сгенерированный Hibernate:

create table users (
   id int8 not null,
    file_name varchar(255),
    file_path varchar(255),
    /* Lots of other fields */
    primary key (id)
)
create table users_avatars (
   user_id int8 not null,
    primary key (user_id)
)

Почемуэто так?Пожалуйста помоги.Заранее спасибо.

1 Ответ

0 голосов
/ 07 июля 2019

Вы можете использовать отображение @OneToOne с @MapsId, чтобы использовать user_id в качестве поля id для таблицы user_avatars

...