Java Hibernate多态性(扩展父类)
关于Hibernate多态性和扩展父类(我不能直接修改)的问题。我的父类称为Contact: 子类称为ContactLocation,它将位置与联系人关联: 生成的数据库表结构似乎正确: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表中创
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);
}
}