繁体   English   中英

Hibernate JPA连接继承

[英]Hibernate JPA Joined Inheritance

我有一个项目,它的一部分数据结构是使用@Inheritance(strategy = InheritanceType.JOINED)制成的。 数据结构的该部分看起来像这样:

在此处输入图片说明

该设计基于本文的思想 我正在使用带有JPA2接口的Hibernate作为我的数据层。 上面的结构导致了以下pojo / dao类(省略了getter和setter):

BaseItem:

@Entity
@Table( name = "base_item" )
@Inheritance(strategy = InheritanceType.JOINED)
public class BaseItemPojo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
}

体育项目:

@Entity
@Table( name = "physical_item" )
public class PhysicalItemPojo extends BaseItemPojo{
}

SomeHardware:

@Entity
@Table( name = "some_hardware" )
public class SomeHardwarePojo extends PhysicalItemPojo{
}

SomeOtherHardware:

@Entity
@Table( name = "some_other_hardware" )
public class SomeOtherHardwarePojo extends PhysicalItemPojo{
}

这是我的问题:

我的其他一张表中有一个对base_item类的引用,如果该类基于该base_item_id加载了“ some_hardware”或“ some_other_hardware”,它将使我的生活更加轻松。 因此,我在特定的类上做了如下的导航属性:

@Entity
@Table( name = "some_navigation_class" )
public class SomeNavigationClassPojo{
    @ManyToOne(optional = false)
    @JoinColumn(name="base_item_id", insertable = false, updatable = false)
    private BaseItemPojo baseItem;

    @ManyToOne
    @JoinColumn(name="base_item_id", insertable = false, updatable = false)
    private PhysicalItemPojo physicalItem;

    @ManyToOne()
    @JoinColumn(name = "base_item_id", insertable = false, updatable = false)
    private SomeHardwarePojo someHardwarePojo;

    @ManyToOne()
    @JoinColumn(name = "base_item_id", insertable = false, updatable = false)
    private SomeOtherHardwarePojo someOtherHardwarePojo;
}

您可能已经猜到了,以上方法无效。 如果我尝试访问具有附加到实体的相关“ SomeHardwarePojo”的“ SomeNavigationClassPojo”,则会收到以下错误:

java.lang.IllegalArgumentException:无法将SomeOtherHardwarePojo字段SomeNavigationClass.someOtherHardware设置为SomeHardwarePojo。

作为参考,我的目标是,如果数据库中不存在someHardwarePojo或someOtherHardwarePojo,则应将它们设置为null,而不要尝试将其映射到PhysicalItemPojo的其他子项

您可以将属性添加为简单的获取器:

public class SomeNavigationClassPojo {
    ...
    public SomeHardwarePojo getSomeHardwarePojo() { 
        return baseItem instanceof SomeHardwarePojo ? (SomeHardwarePojo) baseItem : null; 
    }
    ...
}

主要缺点:您不能在JPA查询中使用属性-例如,类似SELECT n FROM SomeNavigationClassPojo n JOIN n.somehardwarepojo s WHERE s.propertyOfHardwarePojo = 'x'是不可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM