2014-12-25 3 views
0

Я использую hibernate и Mysql в проекте java для сохранения. У меня есть два объекта Сделки и Служба. Транзакция имеет отношение много к одному к сервису. Я хотел использовать не первичный столбец (SERVICE_CODE) типа VARCHAR из таблицы Service в качестве внешнего ключа в таблице транзакций. Но когда я делаю это, я получаю следующее исключение.Сопоставление объектов с использованием столбца не первичного ключа

SQL Error: 1452, SQLState: 23000 
Cannot add or update a child row: a foreign key constraint fails. 

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

@Entity 
@Table(name="Transaction") 
public class Transaction { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="TRANSACTION_ID") 
    long transactionId; 


    @ManyToOne 
    @JoinColumn(name="SERVICE_CODE") 
    Service service; 
} 


@Entity 
@Table(name="SERVICE") 
public class Service { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="SERVICE_ID") 
    Long serviceId; 

    @Column(name="SERVICE_CODE") 
    String serviceCode; 
} 
+0

Пожалуйста, откройте его, так как я отредактировал вопрос и добавил пример кода – Rishi

ответ

0

Как объяснено в this article, вы должны использовать атрибут @JoinColumn аннотацию referencedColumnName указать ссылочный столбец внешнего ключа отношения.

@ManyToOne 
@JoinColumn(name="SERVICE_CODE", referencedColumnName="SERVICE_CODE") 
Service service; 

С этой модификации DDL генерируется правильно, как это:

alter table Transaction 
    add constraint FK_5k37nrtsvi22y2jhsde903ps9 
    foreign key (SERVICE_CODE) 
    references SERVICE (SERVICE_CODE); 

и с исходным кодом, как это (он ссылается на первичный ключ SERVICE таблицы вместо SERVICE_CODE колонки):

alter table Transaction 
    add constraint FK_5k37nrtsvi22y2jhsde903ps9 
    foreign key (SERVICE_CODE) 
    references SERVICE; 
Смежные вопросы