Проблема с добавлением сопоставления @ManyToOne для не первичного ключа в SQL Server - PullRequest
4 голосов
/ 20 августа 2010

У меня проблема с изменением приложения 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'.

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

table1:

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

table2:

@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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 21 августа 2010

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

9.1.8 Аннотация Id

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

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

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

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

Я не могу воссоздать table1, потому что это существующая таблица.Я должен использовать опцию alter table из библиотеки DLL: «alter table table2 добавить ограничение FK1751F2B3CEB31922 внешний ключ (table1_login) ссылается на table1», и я скорее хочу ссылочную целостность.говорит о внешних ключах: внешний ключ идентифицирует столбец или набор столбцов в одной (ссылающейся) таблице, которая ссылается на набор столбцов в другой (ссылающейся) таблице.Столбцы в ссылочной таблице должны быть первичным ключом или другим подходящим ключом в ссылочной таблице.

Таким образом, пока вы не можете применить приведенный выше оператор alter (* 1032)* не может ссылаться на id таблицы1, вы можете сделать login уникальным в таблице1 и создать ограничение FK, которое будет ссылаться на login. Что-то вроде этого:

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

Предполагается, что вы добавили ограничение UNIQUE для входа в систему в таблице 1.

См. Также

1 голос
/ 20 августа 2010

EDIT:

ПОСЛЕ прочтения сообщения я нашел это ...

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

Table1. ID -> table2. table1_login .

ID и логин не совпадают с типом данных. Таким образом, существует неправильное отношение PK-FK вокруг ...


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

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

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

...