JPA OneToOne разъяснения - PullRequest
       12

JPA OneToOne разъяснения

1 голос
/ 26 сентября 2010

Я читал эту книгу. Объясняя «однонаправленный @OneToOne», автор взял следующий Customer, Address пример:

@Entity
public class Customer{
   @Id @GeneratedValue
   private Long id;
   private String name;
   private Address address;
   //few other columns, getters/setters
}

@Entity
public class Address{
   @Id @GeneratedValue
   private Long id;
   private String city;
   //few other columns, getters/setters

}

И говорил это -

  • Это необходимый минимум annotaions.
  • Нет @OneToOne аннотации необходимо (потому что по умолчанию поставщик персистентности примет это)
  • Аннотация @JoinColumn позволяет вам настроить отображение иностранного ключ. Как показано ниже, мы можем переименовать столбец внешнего ключа в ADD_FK

А потом об этом:

@Entity
public class Customer {    
    @Id    @GeneratedValue    
    private Long id;      
    private String name;    
    @OneToOne       
    @JoinColumn(name="ADD_FK")    
    private Address address;    
    //few other    columns, getters/setters 
}

@Entity
public class Order {   
    ....       
    List<OrderLine> orderLines;   
    ... 
}
  • По умолчанию отношение OneToMany равно предположить, когда коллекция тип сущности используется.

Мои вопросы:

  1. Являются ли приведенные выше утверждения действительными? Потому что, когда я пробовал эти примеры в Hibernate, я получал исключения.

  2. Делаются ли заявления согласно JPA стандарты?

  3. Или это Hibernate реализован по-другому?

Просьба уточнить.

1 Ответ

4 голосов
/ 26 сентября 2010

Насколько мне известно, отношения между сущностями должны быть явно отображены.Из спецификации JPA 1.0 (жирным шрифтом является мое):

2.1.7 Отношения между сущностями

Отношения между сущностями могут быть один-к-одному, один-ко-многим, многие-многие.один или много ко многим.Отношения полиморфны.

Если существует связь между двумя сущностями, к соответствующему постоянному свойству или полю ссылочной сущности должна быть применена одна из следующих аннотаций моделирования отношений : OneToOne, OneToMany, ManyToOne, ManyToMany.Для ассоциаций, которые не указывают целевой тип (например, где универсальные типы Java не используются для коллекций), необходимо указать сущность, которая является целью отношения.

(...)

И это не изменилось в JPA 2.0.

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

Но если кто-то не может показать мне соответствующую часть спецификации, я считаю поведение правильным.

Ссылки

  • Спецификация JPA 1.0
    • Раздел 2.1.7 «Взаимоотношения сущностей»
  • Спецификация JPA 2.0
    • Раздел 2.9 «Взаимоотношения сущностей»
...