Спящий полиморфизм (расширение родительского класса) - PullRequest
0 голосов
/ 15 сентября 2010

Вопрос, касающийся полиморфизма гибернации и расширения родительского класса (который я могу не изменять напрямую).Мой родительский класс называется Contact :

@Entity 
@Table(name="contact")
@Inheritance(strategy=InheritanceType.JOINED) 
public class Contact {
  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
  public long id;
  public String name;
} 

А дочерний класс называется ContactLocation , который связывает Местоположение с Контакт :

@Entity 
@Table(name="contact_location") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class ContactLocation extends Contact {
  @ManyToOne(targetEntity=Location.class, cascade=CascadeType.ALL)
  Location location;
}

Полученная структура таблицы базы данных выглядит правильно:

contact: 
 id:long 
 name:varchar

contact_location: 
 contact_id:long 
 location_id:long

Вот мой метод сохранения, который мне нужно либо обновить существующий ContactLocation или сохраните новый ContactLocation для существующего Contact :

public void saveContact(Object dialog) { 
  Contact contact = ui.getAttachedObject(dialog, Contact.class); 
  ContactLocation contactLocation = null; 
  if (contact instanceof ContactLocation) { 
     LOG.debug("Casting Contact to ContactLocation"); 
     contactLocation = (ContactLocation)contact; 
     //TODO Update existing ContactLocation
     //UPDATE contact_location SET location_id = 33 WHERE contact_id = 22;
  } 
  else { 
     LOG.debug("Contact NOT instanceof ContactLocation"); 
     //TODO Save new ContactLocation from existing Contact
     //INSERT INTO contact_location (contact_id, location_id) VALUES (22,33);
  }
}

Как создать строку в таблице contact_location , котораясопоставляет контакт с местоположением с использованием моего ContactLocationDao ?

1 Ответ

2 голосов
/ 15 сентября 2010

Нет поддержки для объектов, меняющих тип после создания, о которых я знаю.Боюсь, вам придется создать новый объект ContactLocation, обновить возможные ссылки, а затем удалить исходный контакт.

...