休眠:覆盖(实体)超类的 OneToMany 映射字段?
Posted
技术标签:
【中文标题】休眠:覆盖(实体)超类的 OneToMany 映射字段?【英文标题】:Hibernate: overriding the (entity) superclass's OneToMany mapped field? 【发布时间】:2016-07-22 18:24:23 【问题描述】:是否可以让子类(实体)覆盖其超类(实体)的 OneToMany 映射?目前我收到“HibernateException:找到对集合的共享引用”,大概是因为超类实体和子类实体都链接到同一个列表。
(我的理解是@AssociationOverride 只能在超类为@MappedSuperclass 时使用,而不是@Entity。我不想将超类从@Entity 更改为@MappedSuperclass,因为我想要超类的表和能够对其进行查询。)
我怎样才能让 Hibernate 映射如下?
@Entity
public abstract class PetOwner
@OneToMany(targetEntity = Pet.class, mappedBy = "owner")
public <T extends Pet> List<T> getPets()
...
@Entity
public abstract class Pet
@ManyToOne(targetEntity = PetOwner.class)
@JoinColumn(name = "owner_id", referencedColumnName = "id")
public <T extends PetOwner> T getOwner()
...
@Entity
public class CatOwner extends PetOwner
@Override
@OneToMany(targetEntity = Cat.class, mappedBy = "owner")
public List<Cat> getPets()
...
@Entity
public class Cat extends Pet
@Override
@ManyToOne(targetEntity = CatOwner.class)
@JoinColumn(name = "owner_id", referencedColumnName = "id")
public CatOwner getOwner()
...
【问题讨论】:
【参考方案1】:最后我用@Override @Transient 标记了子类的getter(CatOwner.getPets() 和Cat.getOwner())。
【讨论】:
以上是关于休眠:覆盖(实体)超类的 OneToMany 映射字段?的主要内容,如果未能解决你的问题,请参考以下文章
注释 ConcurrentHashMap 时,在休眠中“非法尝试将非集合映射为 @OneToMany、@ManyToMany 或 @CollectionOfElements”