Java Hibernate多态性(扩展父类)

Java Hibernate多态性(扩展父类),java,hibernate,orm,polymorphism,Java,Hibernate,Orm,Polymorphism,关于Hibernate多态性和扩展父类(我不能直接修改)的问题。我的父类称为Contact: 子类称为ContactLocation,它将位置与联系人关联: 生成的数据库表结构似乎正确: contact: id:long name:varchar contact_location: contact_id:long location_id:long 以下是我的保存方法,我需要更新现有联系人位置,或为现有联系人保存新的联系人位置: 如何在contact\u location表中创

关于Hibernate多态性和扩展父类(我不能直接修改)的问题。我的父类称为Contact:

子类称为ContactLocation,它将位置与联系人关联:

生成的数据库表结构似乎正确:

contact: 
 id:long 
 name:varchar

contact_location: 
 contact_id:long 
 location_id:long
以下是我的保存方法,我需要更新现有联系人位置,或为现有联系人保存新的联系人位置:


如何在contact\u location表中创建一行,该行使用我的ContactLocationDao将contact映射到一个位置?

据我所知,不支持在创建后更改对象类型。恐怕您必须创建一个新的ContactLocation对象,更新可能的引用,然后删除原始联系人

该死的,我很害怕。这看起来很奇怪,因为我真正想做的是:更新contact_location SET location_id=33,其中contact_id=22;[或]插入触点位置(触点id,位置id)值(22,33);还有很多其他类引用Contact,所以我不认为删除原始Contact是一个选项……当然,如果需要,您仍然可以在SQL中这样做。Hibernate实际上只是提供了一种将Java类结构持久化到数据库的方法;SQL中的许多自然现象对于对象来说都比较困难。唉,汉宁,你能想出更好的办法来解决这个问题吗?我基本上需要将现有联系人映射到一个位置,并且不能修改联系人类。@Dale:本机SQL查询的替代方法是创建一个实体,该实体不是从
Contact
继承的,例如
ContactLocation
实体,属性为
Contact
Location
。这种方法的缺点是在
Contact
对象上没有
getLocation()
方法,但是您必须在代码中找到相应的位置(即调用存储库)。Nathan,我认为ContactLocation应该是自己的类,它包含一个Contact和一个Location成员?这是我最初采用的方法,但要同时提取Contact的集合和ContactLocation的集合并将它们合并到我的ui表中,有点痛苦。你能想出更好的方法吗?Nathan,我修改了ContactLocation以包含联系人和位置成员,但是现在遇到了删除原始联系人的问题。由于无法更改联系人类,因此无法添加@OneToMany关系,因此删除父联系人失败。
@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
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);
  }
}