JPA: аннотация внешнего ключа

21

У меня есть два объекта базы данных: Forum и Topic .

Topic имеет protected long forumId члена данных, что указывает, конечно, на форум Topic .

Мой вопрос в том, какую аннотацию использовать для этого элемента данных?

    
задан socksocket 10.08.2012 в 18:46
источник
  • Вам не нужно объявлять, что forumId в теме. –  Bhesh Gurung 10.08.2012 в 18:50
  • почему ты так говоришь? Я думаю, что это необходимо, потому что я должен знать, к какому форуму относится эта тема. –  socksocket 10.08.2012 в 18:53
  • @socksocket Я думаю, это потому, что вы можете аннотировать атрибут Forum, указав id с помощью аннотации @JoinColumn, см. мой ответ. ;) –  elias 10.08.2012 в 18:54

3 ответа

27

Как форум имеет много тем, а тема относится к одному и только форуму, вы, вероятно, захотите пойти с атрибутом типа Forum, аннотированным с помощью @ManyToOne :

@ManyToOne
@JoinColumn(name = "forumId")
private Forum forum;

Подробнее:

ManyToOne и JPA

    
ответ дан elias 10.08.2012 в 18:51
источник
  • , но «проблема» в этом случае заключается в том, что при сериализации вашей темы в XML или JSON (например, для передачи ее клиенту) весь объект Forum также будет сериализован по умолчанию ... то же самое, если вы загружаете тему на свой сервер, вам нужно передать все объекты Topic + Forum, вы не можете просто использовать идентификатор форума. В некоторых случаях проще просто вставить внешний ключ связанного объекта вручную. –  splinter123 10.09.2014 в 00:45
5

Как и другие ответили -
Вы должны использовать аннотации ManyToOne и JoinColumn.
Напомним, что поскольку JPA относится к ORM - реляционному сопоставлению объектов,
Вы должны ссылаться на другой объект, как вы бы сделали «естественно» в Java - например, через объект, а не через его идентификатор (который является forumId) в вашем случае),
 Это было одним из проектных соображений между отношениями в JPA и Hibernate (ранее в JPA).

    
ответ дан Yair Zaslavsky 10.08.2012 в 18:57
источник
1

@ManyToOne Как видно из аннотации - у вас много тем для форума

    
ответ дан munyengm 10.08.2012 в 18:52
источник