2016-03-01 5 views
0

В этом примере из https://docs.oracle.com/javaee/7/tutorial/persistence-criteria002.htmJPA @JoinColumn и отношения между объектами

@Entity 
public class Pet { 
    @Id 
    protected Long id; 
    protected String name; 
    protected String color; 

    @ManyToOne 
    protected Set<Person> owners; 
    ... 
} 

У меня есть два вопроса по этому поводу:

1) Почему не там @JoinColumn аннотаций ниже @ManyToOne?

2) Почему нет спецификатора в @ManyToOne (targetEntity = Person.class)?

3) Значит ли это @ManyToOne, что многие люди отображают одно домашнее животное? Если это так, то почему он задает владельцев? Я подумал, что это должно быть просто

@ManyToOne 
protected Person owner; 

В этом примере:

@Entity 
public class Company { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company") 
    private List<Branch> branches; 
} 

@Entity 
public class Branch { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "companyId") 
    private Company company; 
} 

В "@JoinColumn (имя = "CompanyID")", почему нет "referencedColumnName = идентификатор"? Это действительно?

ответ

0

Аннотации JoinColumn не являются обязательными. Я не уверен, почему так много учебников используют эту аннотацию, поскольку она только отменяет поведение по умолчанию. Когда им не нравится созданное по умолчанию имя, предпочтительной будет стратегия пользовательского именования.

Чтобы краток:

  1. Существует не JoinColumn аннотации, потому что его факультативные и кто-то решил не использовать его. Возможно, он хочет поведения по умолчанию.
  2. TargetEntity необходим только в том случае, если связанная сущность отличается от той, что находится в модели. (Возможно, другая реализация одного класса)
+0

Без JoinColumn и referColumnName, откуда вы знаете, через какие поля связаны два объекта? – ling

+0

Это зависит от используемой стратегии именования. Обычно это что-то вроде «name'_id» или «name'Id» (например, company_id или companyId). Преимущество стратегии именования заключается в том, что она позволяет, например, префикс каждого сгенерированного имени таблицы. См. Например - https://docs.jboss.org/hibernate/orm/3/api/org/hibernate/cfg/ImprovedNamingStrategy.html –

+0

Пожалуйста, третий вопрос в классе Pet. Я просто добавил. – ling

1

1) Почему нет @JoinColumn аннотации ниже @ManyToOne?

По той же причине, что id, имя и цвет не имеют аннотации @Column. Имя поля совпадает с именем в таблице DB. Когда это произойдет, вам не нужно включать @column или @JoinColumn аннотацию (а также @Table)

2) Почему не является отборочным в @ManyToOne (targetEntity = Person.class)?

Вы уже сказали, что является объектом-объектом с помощью Set.

В "@JoinColumn (name =" companyId ")", почему нет "referencedColumnName = id"? Это действительно?

Вы не делаете этого, в компании @Entity, я предполагаю, что у вас есть аннотация @Id в каком-то поле.

+0

Как идентификатор класса компании, связанный с companyId в филиале, без ссылкиColumnName = id? – ling

+0

Компания связана с филиалом через mappedBy = «компания», которая является названием атрибута компании в филиале: частная компания ** компания **; – alvgarvilla

2

Похоже, это неправильно

@ManyToOne 
protected Set<Person> owners; 

Это должно быть

@ManyToMany 
protected Set<Person> owners; 

или

@ManyToOne 
@JoinColumn 
protected Person owner; 

Так @JoinColumn не может быть использован с @ManyToMany ассоциации, из-за объединения таблица используется для таких ассоциаций. В любом случае, когда это уместно, я всегда использую @JoinColumn, чтобы сделать отображение более понятным.

Почему нет классификатора в @ManyToOne(targetEntity = Person.class)?

Это может быть определено общим Set<Person>. Поэтому не нужно указывать. И это не помогает понять картографию.

В "@JoinColumn (имя = "CompanyID")", почему нет " referencedColumnName = идентификатор"? Это действительно?

Hibernate делает объединение, используя id свойство Company по умолчанию. Это действительно.

Резюме

Я вижу много отображений с десятками ненужных аннотаций. Это очень трудно понять. Пожалуйста, используйте только те аннотации, которые делают отображение более четким.

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