Аннотации Hibernate не работают для получателей, но работают для атрибутов - PullRequest
5 голосов
/ 17 ноября 2010

У меня проблема с аннотациями в спящем режиме. Для кода, показанного ниже, у меня есть класс отеля, класс клиента, и я использую заказ по бронированию отелей для отслеживания того, какой клиент забронировал какой отель и наоборот. но когда я размещаю аннотации на получателях отеля и клиента, это дает исключение, и удивительно, что это работает, когда я размещаю его на атрибутах. Может кто-нибудь сказать, почему это так?

`Caused by: org.hibernate.MappingException: Could not determine type for: com.xebia.hotelBooking.domain.Customer, at table: CustomerHotelBooking, for columns: [org.hibernate.mapping.Column(customer)]
 at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:290)
 at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:274)
 at org.hibernate.mapping.Property.isValid(Property.java:217)
 at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464)
 at org.hibernate.mapping.RootClass.validate(RootClass.java:236)
 at org.hibernate.cfg.Configuration.validate(Configuration.java:1193)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1378)
 at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
 at org.jboss.seam.persistence.HibernateSessionFactory.createSessionFactory(HibernateSessionFactory.java:165)
 at org.jboss.seam.persistence.HibernateSessionFactory.startup(HibernateSessionFactory.java:79)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
 at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144)
 at org.jboss.seam.Component.callComponentMethod(Component.java:2249)
 at org.jboss.seam.Component.callCreateMethod(Component.java:2172)
 at org.jboss.seam.Component.newInstance(Component.java:2132)`

У меня есть Hotel Bean, как показано `

@Id
 @GeneratedValue
 private int id;

 private String description;

 private String city;

 private String name;

 private String rating ;

 private int isBooked; 
 `

Бобы Cusomer как `

        @Id
 @GeneratedValue
 private int id;

 private String userName;

 private String password;

`

и класс CustomerHotelBooking как

       @Id
 @GeneratedValue
 private int id;

 private Hotel hotel;

 private Customer customer;


        @ManyToOne
 @Cascade(value = { CascadeType.ALL })
 public Customer getCustomer() {
  return customer;
 }

 /**
  * @param customer the customer to set
  */
 public void setCustomer(Customer customer) {
  this.customer = customer;
 }

 /**
  * @return the user
  */



 /**
  * @return the hotel
  */
        @ManyToOne
 @Cascade(value = { CascadeType.ALL })
 public Hotel getHotel() {
  return hotel;
 }

 /**
  * @param hotel
  *            the hotel to set
  */
 public void setHotel(Hotel hotel) {
  this.hotel = hotel;
 }

1 Ответ

7 голосов
/ 17 ноября 2010

Документы говорят:

2.2.2.2. Тип доступа

По умолчанию тип доступа иерархии классов определяется положением аннотаций @Id или @EmbeddedId. Если эти аннотации находятся в поле, то для сохранения сохраняются только поля, а состояние доступно через поле. Если на получателе есть аннотации, то только постоянные считаются получателями и доступ к состоянию осуществляется через получателя / установщика. Это хорошо работает на практике и является рекомендуемым подходом.

Так что это ожидаемое и задокументированное поведение - поэтому размещайте свои аннотации последовательно - либо поля, либо получатели.

(Если вы читаете документацию ниже того, что я цитировал, там говорится, что есть способ смешивать типы доступа, используя аннотацию @Access, но я бы не рекомендовал - будьте последовательны. Я лично предпочитаю ставить аннотации на полях)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...