2016-08-19 4 views
0

На самом деле, смущенный тем, как один из многих работает в JPA, все документы, которые я читаю, используют как один, так и много один в своем примере, и я не знаю, нужны они или нет нет, и это не сработает, когда я попробовал.JPA Hibernate от одного до большого числа

Мой вопрос: предположим, что у меня есть две таблицы, и я хочу заполнить объект колледжа с помощью метода findCollegeData(), чтобы весь ученик этого колледжа был в списке, когда я инициализирую объект.

Ниже приводится мой подход. Я могу хранить всех студентов в списке колледжей с помощью метода storeCollegeData(), но я не могу полностью восстановить объект колледжа, список учеников всегда пуст, хотя данные находится в базе данных, и он работает, если я пытаюсь самостоятельно искать ученика, используя имя колледжа.

public static EntityManager entityManager = something; 

@Entity 
@Data 
@NoArgsConstructor 
@AllArgsConstructor 
public College { 
    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private int cId; 
    private String collegeName; 
    private int numOfStudent; 

    @OneToMany(mappedBy="collegeName", cascade=CascadeType.ALL, orphanRemoval=true) 
    private List<Student> studentList = new ArrayList<>(); 
} 


@Entity 
@Data 
@NoArgsConstructor 
@AllArgsConstructor 
public Student { 
    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private int sId; 
    private String name; 
    private String collegeName; 
    private String city; 
} 


// college.getStudentList is always empty and I don't know why 
public findCollegeData(String collegeName) { 
    College college = entityManager.find(College.class, collegeName); 
} 

// Student data in the studentList are inserted into student table 
public storeCollegeData(College college) { 
    entityManager.persist(college); 
} 

// This method works 
public findStudent(String collegeName) { 

    CriteriaBuilder cb = provider.get().getCriteriaBuilder(); 
    CriteriaQuery<Student> query = cb.createQuery(Student.class); 
    Root<Student> student = query.from(Student.class); 

    query.where(
      cb.and(
        cb.equal(student.get("collegeName"), collegeName) 
      ) 
    ); 

    JobStatisticDB Student = provider.get().createQuery(query).getSingleResult(); 
} 

Мне что-то не хватает ??? Является ли соединение более подходящим, чем карта здесь ??? Я не знаю Ват делать человеку

Редакцией: Понял работать, изменяя оба collegeName в качестве первичного ключа таблицы, добавив @Id аннотацию, однако, хотя, как я могу добавить Sid и ИДС в таблицы, чтобы они могли иметь дублирующее название колледжа ???? Прямо сейчас, я не могу дублировать колледж с тем же именем, и студент, который поступает в тот же колледж!

Final Отредактировано: Изменен дизайн базы данных для использования ключа см решения иностранного ниже

ответ

1

Принимаемый ответ неверен: вы определяете отношения между объектами. Отображения должны быть как ниже для двунаправленного @OneToMany

Колледж:

@Entity 
@Data 
@NoArgsConstructor 
@AllArgsConstructor 
public College { 
    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private int cId; 
    private String collegeName; 
    private int numOfStudent; 

    @OneToMany(mappedBy="college", cascade=CascadeType.ALL, orphanRemoval=true) 
    private List<Student> studentList = new ArrayList<>(); 
} 

Студент:

@Entity 
@Data 
@NoArgsConstructor 
@AllArgsConstructor 
public Student { 
    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private int sId; 
    private String name; 
    private String city; 

    //student table has a FK column college_id 
    @ManyToOne 
    @JoinColumn(name = "college_id") 
    private College college; 
} 

EntityManager найти() принимает ПК в качестве аргумента:

public findCollege(int collegeId) { 
    College college = entityManager.find(College.class, collegeId); 
    college.getStudents(); //will be populated 
} 

public findStudent(int studentId) { 
    Student student = entityManager.find(Student.class, studentId); 
    student.getCollege(); //will be populated 
    student.getCollege().getStudents(); //will be populated 
} 

Если вы хотите найти колледж по имени, создайте запрос JPQL или Criteria:

+0

, но у меня нет столбца FK, хотя я просто хочу присоединиться к ним в том же coloum, который я указал. В этом случае я хочу, чтобы они присоединились к имени колледжа coloum –

+1

Редизайн вашей базы данных. Hibernate - это объект-реляционный сопоставитель. В настоящее время у вас нет реляционной базы данных. –

+0

Получил это, чтобы работать, спасибо –

1

Поля вы ссылаетесь в mappedBy должен содержать значение, равное поле идентификатора College «s. Измените его на collegeName вместо city, и он должен работать.

+0

Я изменил карту на имя колледжа, не работает, но теперь предположим, что я добавляю член cId, и он не работает, и если я добавлю 2 @id в cId и collegeName, тогда я получаю сообщение об ошибке «У внешнего ключа должно быть такое же количество столбцов, что и ссылочный первичный ключ», и если бы я удалил член cId и просто сохранил имя колледжа как идентификатор, я не могу вставить данные в базу данных. –

+0

nvm Мне кажется, что он работает , я изменил оба имени колледжа как идентификатор для обоих классов, затем они могут отображаться, но, тем не менее, поскольку они оба являются основным ключом, я не могу дублировать колледж с тем же именем, что действительно меня бранит, и я добавляю еще один член с @id, я получаю ошибку отображения составного ключа, любое решение для него? –

+0

Извините, но этот ответ неверен. –