2015-07-12 3 views
3

Я работаю на приложения Java и используя JPA для взаимодействия с базой данных, у меня есть два важных вопроса:JPA Аннотации и mappedBy

  1. Я хочу сделать двунаправленную связь между двумя классами, так как мне нужно доступ к данным с обеих сторон. Возьмем случай двух классов A и B с A * -1 B (как UML-диаграмма, A имеет единственное B и B имеет несколько A ...).

в A:

@ManyToOne 
private B attribute; 

в B

@OneToMany 
private List<A> list; 

Этого достаточно, чтобы сделать ссылку двухстороннюю? или обязательно использовать сопоставленный?

  1. Который подводит нас к моему второму вопросу, если mappedBy находится на неправильной стороне, это просто повлияет на производительность или, что еще хуже? (данные не сохраняются)? Например, в случае мощности 1- * у нас нет никакого выбора, то mappedBy должен быть в стороне OneToMany и в этом случае:

в B

@OneToMany(mappedBy = "attribute") 
private List<A> list; 

Зная тот факт, что я не создаст класс B и не создаст список и не назначит объекты, я ничего не сделаю в стороне B. Я просто создам повторно классы A и каждый раз, когда я назначаю ему объект B, поэтому у меня может быть несколько классов A, которые имеют тот же затронутый объект B, и я хочу, чтобы B автоматически обновлял эту ссылку и ее список A.

ответ

1
  • mappedBy следует добавить к объекту, который не имеет внешнего ключа в своей таблице (скорее всего, B в этом случае).
  • Если mappedBy находится по ту сторону, вы должны увидеть исключение.
2

Достаточно ли этого для двусторонней связи? или обязательным является использование mappedBy?

Для отношений Bi-directional обязательно.

Это подводит нас ко второму вопросу, если mappedBy помещается на изнанка, это просто влияние на производительность или даже хуже? (данные не сохраняются)?

Хуже - это не сработает, но это не будет бесшумно, вы увидите исключения.

Сказав это, просто понять. Он идет с @OneToMany.

This может помочь вам в понимании этого подробнее.

+1

большое спасибо ! 1- так что, если я не укажу mappedBy, он будет работать, но мы не будем иметь никакой связи между этими двумя именами правильно? 2- Случай mappedBy помещен на неправильную сторону, может произойти только в случае OneToMany или ManyToOne , потому что для 1-1 и * - * мы можем выбрать, какая сторона права владельца? 3- Если mappedBy находится на неправильной стороне, У меня будут исключения, когда я попытаюсь добавить данные в базу данных, а не в начале (просто кодируя модель) правильно? Большое спасибо – TER

+0

Да, вы правы на всех трех учетных записях. Просто для уточнения пункта 1: Да, вы правы в отношении связи между ними.Его называют «двунаправленными» отношениями, которые вы найдете в этом термине, поскольку вы копаете глубже в JPA. – Shahzeb

1

Достаточно ли этого для двусторонней связи? или обязательным является использование mappedBy?

Не совсем. Вам необходимо do атрибут MappedBy для двунаправленных отношений «много-к-одному» на обратной стороне - это сторона, которая не имеет внешнего ключа, и всегда является одной из сторон во взаимно-однозначных отношениях. Вам также нужна информация о joincolumn на стороне .

Так что в итоге:

Многие к одному стороны - владеющая сторона отношений - @JoinColumn информации находится на этой стороне. Это должно быть указано в обеих однонаправленных и двунаправленных отношениях

Один-ко-многие стороны - с обратной стороны - mappedBy Attribute на этой стороне. Это нужно указать, если отношение является двунаправленным.

@Entity 
public class A …….. 
//Owning side of the relationship with the @JoinColumn annotation. 
    @ManyToOne 
    // Assume TABLEPK column holds PK of B's table 
    @JoinColumn (name = "TABLEBPK") 
    private B attribute; 


@Entity 
public class B …… 

//Inverse side of the relationship with the MappedBy attribute. 
    @OneToMany(MappedBy = “attribute”) 
    private List<A> list; 

Это подводит нас ко второму вопросу, если mappedBy помещается на изнанка, это просто влияние на производительность или даже хуже?

Это не сработает. Просто поставьте его на обратную сторону отношений.

Зная тот факт, что я не буду создавать класс B, и создать список и присвоить объекты, я не буду делать ничего в стороне B. Я просто создать повторно классов А и каждый раз, когда я задаю это объект B, поэтому я могу иметь несколько классов A, которые имеют один и тот же пораженный объект B, и я хочу , что B автоматически обновляет эту ссылку и свой список А.

в этом случае вы создаете класс A, с атрибутом , заполненным экземпляром B. Теперь, когда вы p ersist A - новый экземпляр - он будет содержать экземпляр B в поле атрибута, который может быть или не быть новым. Мы хотим, чтобы JPA продолжала A, а затем переходила через отношения и сохраняла B также. Если B уже существует в контексте perssitence, то игнорируйте его. Добавление CascadeType.PERSIST достигнет этого.

@Entity 
public class A …….. 
//Owning side of the relationship with the @JoinColumn annotation. 
    @ManyToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn (name = "TABLEBPK") 
    private B attribute; 

Эти ребята пишут очень хорошо на этом материале .... "Pro JPA 2 Овладение Java ™ Persistence API" Майком Китом и Меррик Schnicariol.»

Смежные вопросы