Проблема Добавление отображения @manytoone на не первичной ключ в SQL Server

StackOverflow https://stackoverflow.com/questions/3530393

Вопрос

У меня есть проблема с изменением моего приложения Spring/Hibernate с MySQL на SQL Server.

Когда Hibernate обновляет базу данных, запустив сервер, который он хочет создать ( hibernate.hbm2ddl.auto установить на update ) база данных, но иностранная ключ не удается при следующей ошибке:

Unsuccessful: alter table table2 add constraint FKDC2DC97ECEB31922 foreign key (login) references table1
Column 'table1.id' is not the same data type as referencing column 'table2.table1_login' in foreign key 'FKDC2DC97ECEB31922'.

Картирование выглядит следующим образом:

Таблица 1:

@Id
public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}

Таблица 2:

@ManyToOne
@JoinColumn (name = "table1_login", referencedColumnName = "login", insertable=false, updatable=false)
public Table1 getTable1() {
    return table1;
}
public void setTable1(Table1 table1) {
    this.table1= table1;
}

++ РЕДАКТИРОВАТЬ: SQL выглядит

alt text

Ключи из таблицы 1:

alt text

Таблица Таблица 1 также используется другим приложением, и поэтому этой таблице нуждается в столбце «ID» в качестве первичного ключа. Таким образом, таблица1.id является первичным ключом таблицы 1. Но эта таблица1.id не используется Hibernate, потому что Hibernate использует таблицу1.login в качестве идентификатора (см. Аннотация выше). Но почему SQL Server пытается установить внешний ключ в Table1.id, а не Table1.login?

Спасибо

Это было полезно?

Решение

Вот что пишет спецификация JPA о Id Аннотация:

9.1.8 Аннотация ID

Анотация ID указывает свойство первичного ключа или поле объекта. Аннотация ID может быть применена в сущности или нанесен на карту Superclass.

По умолчанию сопоставленный столбец для первичного ключа объекта предполагается, что является основным ключом первичной таблицы. Если нет Column Указано аннотация, предполагается, что имя столбца первичного ключа является именем свойства или поля первичного ключа.

Поэтому я испытываю желание сказать, что вещи ведут себя в соответствии с спецификацией (и login свойство фактически нанесено на карту на id столбец). Попробуйте указать Column Аннотация:

@Id @Column(name = "login")
public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}

Я не могу воссоздать таблицу1, потому что это огромный стол. Я должен использовать опцию Alter Table из DLL: «Альтер Таблица Таблица 2 Добавить ограничение FK1751F2B3CEB31922 Иностранный ключ (Таблица 1_LOGIN) Ссылки таблицы 1», и я скорее хочу ссылочную целостность.

Чтобы уточнить, вот что говорит Википедия о иностранных ключах: Иностранный ключ идентифицирует столбец или набор столбцов в одной (ссылках) таблице, который относится к набору столбцов в другой (ссылках) таблице. Столбцы в таблице ссылок Должен быть основной ключ или другой ключ кандидата в ссылки на таблицу.

Итак, пока вы не можете применить вышеупомянутый оператор ALTER (table1_login Не могу ссылаться на id Таблица 1, вы можете сделать login уникальный В таблице 1 и создать ограничение FK, которое будет ссылаться на login. Анкет Что-то подобное:

ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)

Это предполагает, что вы добавили UNIQUE Ограничение на вход в таблицу 1.

Смотрите также

Другие советы

РЕДАКТИРОВАТЬ:

После тщательного прочтения сообщения я нашел это ...

'table1.id' не тот же тип данных, что и столбец ссылки 'table2.table1_login'

Таблица 1.Я БЫ -> Таблица 2.Таблица 1_LOGIN.

ID и Login - это не один дат. Так что есть неправильное отношение PK-FK ...


Это звучит так, будто вы используете неправильно collation. Анкет Оба столбца нуждаются в одинаковом сопоставлении. В противном случае вы не можете присоединиться к ним.

http://msdn.microsoft.com/en-us/library/aa174903(sql.80).aspx

Убедитесь, что вы удалите все явно устанавливающие коллекции в сценарии создания базы данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top