Я хочу реализовать внешний ключ в моем проекте Springboot, но он дает мне следующие ошибки - PullRequest
0 голосов
/ 09 октября 2018

Страница ошибки Whitelabel

This application has no explicit mapping for /error, so you are seeing 
this as a 
fallback.Tue Oct 10 17:11:14 IST 2018 There was an unexpected error 
(type=Internal Server 
Error, status=500). could not execute statement; SQL [n/a]; nested 
exception is org.
hibernate.exception.SQLGrammarException: could not execute statement.

Ошибка STS:

Before changing the code

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolation
Exception
: Cannot add or update a child row: a foreign key constraint fails  
(workdemo.officeinfo, CONSTRAINT idFOREIGN KEY (id) REFERENCES mytable 
(id))

After implementing joincolumn

 org.springframework.beans.factory.BeanCreationException: Error 
 creating bean with name 'entityManagerFactory' defined in class path 
 resource [org/springframework/boot/autoconfigure/orm/jpa/
 HibernateJpaConfiguration.class]: Invocation of init method failed; 
 nested exception is org.hibernate.AnnotationException: No identifier 
 specified for entity:com.infidata.modal.MyTable

POJO (значение с геттерами и сеттерами, также сгенерированное значение)

Office.java
package com.infidata.modal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="officeinfo")
public class Office {
@Id
private int sno;
private String batchno;
@ManyToOne
@JoinColumn(name = "id" )
private MyTable myTable;
private String fees;
private String reciptno;
private String trainer;

public Office() {

}

public int getSno() {
    return sno;
}
public void setSno(int sno) {
    this.sno = sno;
}
public String getBatchno() {
    return batchno;
}
public void setBatchno(String batchno) {
    this.batchno = batchno;
}

public String getFees() {
    return fees;
}
public void setFees(String fees) {
    this.fees = fees;
}
public String getReciptno() {
    return reciptno;
}
public void setReciptno(String reciptno) {
    this.reciptno = reciptno;
}
public String getTrainer() {
    return trainer;
}
public void setTrainer(String trainer) {
    this.trainer = trainer;
}
public Office(String batchno,String fees, String reciptno,String trainer) {
    super();
    this.batchno = batchno;
    this.fees = fees;
    this.reciptno = reciptno;
    this.trainer=trainer;
}
@Override
public String toString() {
    return "Office [sno=" + sno + ", batchno=" + batchno + ",fees=" + fees
            + ", reciptno=" + reciptno + ",trainer=" + trainer + "]";
}
}

MyTable.java

package com.infidata.modal;
@Entity
public class MyTable {

 }

База данных (имя базы данных workdemo)

Таблица пользователей (имя таблицы: mytable)

  CREATE TABLE `mytable`

  ( `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `mobile` varchar(10) NOT NULL,
  `email` varchar(45) NOT NULL,
  `college` varchar(45) NOT NULL,
  `branch` varchar(45) NOT NULL,
  `semester` varchar(45) NOT NULL,
  `address` varchar(105) NOT NULL,
  `internship` varchar(45) NOT NULL,
  `batch` varchar(45) NOT NULL,
  `startdate` varchar(45) NOT NULL,
  `enddate` varchar(45) NOT NULL,
   PRIMARY KEY (`id`)
   )
   ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 
   COLLATE=utf8mb4_0900_ai_ci

Таблица Office (имя таблицы: office)

   CREATE TABLE `office`
  (`sno` int(11) NOT NULL AUTO_INCREMENT,
 `batchno` varchar(45) NOT NULL,
 `id` int(11) NOT NULL,
 `fees` varchar(45) NOT NULL,
 `reciptno` varchar(45) NOT NULL,
  PRIMARY KEY (`sno`),
  KEY `id_idx` (`id`),
  CONSTRAINT `id` FOREIGN KEY (`id`) REFERENCES `mytable` (`id`)
)
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Идентификатор (внешний ключ) в офисной таблице должен автоматически автоинкрементироваться со ссылкой на атрибут столбца идентификатора студента

1 Ответ

0 голосов
/ 09 октября 2018

Проблема в том, как вы определили класс сущности:

@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

Когда вы используете JPA, вы должны указать целевой объект отношения, а не поле из базы данных.Ваше определение просто говорит hibernate генерировать значение int, которое не будет соответствовать реальной сущности.Это должно быть примерно так:

@ManyToOne
@JoinColumn(name = "id" )
private User user;

Ваш офисный объект будет

@Entity
@Table(name = "officeinfo")
public class Office {

    @Id
    private int sno;
    private String batchno;

    @ManyToOne
    @JoinColumn(name = "id")
    private User user;

    private String fees;
    private String reciptno;
    private String trainer;
   // getters and setters;
 }

Пожалуйста, убедитесь, что @Id только для sno, а у вас нет других полей,в противном случае произойдет сбой с исключением составного ключа.Пожалуйста, удалите id из вашего объекта, это внешний ключ для пользователя, и он обрабатывается:

 @ManyToOne
 @JoinColumn(name = "id")
 private User user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...