Java 连接表中一个实体扩展另一个实体的列不允许为null

Java 连接表中一个实体扩展另一个实体的列不允许为null,java,jpa,Java,Jpa,我遇到的情况是,我有一个实体vCenter DistributedVirtualPortGroup,它扩展了vCenter网络,并且这两个实体在实体vCenter文件夹中都处于一对一的关系中。我得到以下错误: 原因:org.h2.jdbc.JdbcSQLException:列“网络类型”不允许为空;SQL语句: 在文件夹网络(文件夹类型、文件夹值、分布式虚拟端口组类型、分布式虚拟端口组值)中插入值(?、、?、?)[23502-182] vCenter网络: @Entity @Embeddable

我遇到的情况是,我有一个实体vCenter DistributedVirtualPortGroup,它扩展了vCenter网络,并且这两个实体在实体vCenter文件夹中都处于一对一的关系中。我得到以下错误:

原因:org.h2.jdbc.JdbcSQLException:列“网络类型”不允许为空;SQL语句: 在文件夹网络(文件夹类型、文件夹值、分布式虚拟端口组类型、分布式虚拟端口组值)中插入值(?、、?、?)[23502-182]

vCenter网络:

@Entity
@Embeddable
@Table(name="network")
@DiscriminatorColumn(name="discriminator")
@DiscriminatorValue("Network")
public class VCenterNetwork
{
    @Transient
    private Network network;

    @Transient
    private static Map<MOR, VCenterNetwork> networkMap = new TreeMap<MOR, VCenterNetwork>();

    @EmbeddedId
    private MOR id;
    public MOR getId() {return this.id;}
    public void setId(MOR id) {this.id = id;}
    ...
}
我是JPA新手,但我猜vCenter Folder vCenter Network和vCenter Folder vCenter DistributedVirtualPortGroup都需要一个联接表,但由于vCenter DistributedVirtualPortGroup扩展了vCenter Network,所以它正在使用这两个关系构建一个联接表,但对每个关系使用不同的类型/值对。我假设一次只使用一对,另一对为空。这似乎是个问题。在我看来,字段应该可以为空,或者两组类型/val对应该合并为一个


我假设有办法解决这个问题,但我确实不知道它是什么。

MOR碰巧有成员类型&val,因此连接表中的名称

我通过在network和distributedVirtualPortgroups字段上添加以下JoinTable解决了这个问题:

    @JoinTable
    (
            name="FOLDER_NETWORK",
            joinColumns= {@JoinColumn(name="TYPE", referencedColumnName="TYPE"), @JoinColumn(name="VAL", referencedColumnName="VAL")},
            inverseJoinColumns= {@JoinColumn(name="NETWORK_TYPE", referencedColumnName="TYPE"), @JoinColumn(name="NETWORK_VAL", referencedColumnName="VAL")}
    )
@Entity
@Table(name="folder")
public class VCenterFolder
{
    @Transient
    private Folder folder;

    @Transient
    private static Map<MOR, VCenterFolder> folderMap = new TreeMap<MOR, VCenterFolder>();

    @EmbeddedId
    private MOR id;
    public MOR getId() {return this.id;}
    public void setId(MOR id) {this.id = id;}

    @Embedded
    @OneToMany(cascade=CascadeType.ALL)
    private List<VCenterNetwork> network = new ArrayList<VCenterNetwork>();
    public List<VCenterNetwork> getNetwork() {return this.network;}
    public void getvirtualNetwork(List<VCenterNetwork> network) {this.network = network;}

    @Embedded
    @OneToMany(cascade=CascadeType.ALL)
    private List<VCenterDistributedVirtualPortgroup> distributedVirtualPortgroups = new ArrayList<VCenterDistributedVirtualPortgroup>();
    public List<VCenterDistributedVirtualPortgroup> getDistributedVirtualPortgroups() {return this.distributedVirtualPortgroups;}
    public void setDistributedVirtualPortgroups(List<VCenterDistributedVirtualPortgroup> distributedVirtualPortgroups){this.distributedVirtualPortgroups = distributedVirtualPortgroups;}
    ....
}
FOLDER_NETWORK
    FOLDER_TYPE - VARCHAR(255) NOT NULL
    FOLDER_VAL - VARCHAR(255) NOT NULL
    NETWORK_TYPE - VARCHAR(255) NOT NULL
    NETWORK_VAL - VARCHAR(255) NOT NULL
    DISTRIBUTEDVIRTUALPORTGROUP_TYPE - VARCHAR(255) NOT NULL
    DISTRIBUTEDVIRTUALPORTGROUP_TYPE - VARCHAR(255) NOT NULL
    @JoinTable
    (
            name="FOLDER_NETWORK",
            joinColumns= {@JoinColumn(name="TYPE", referencedColumnName="TYPE"), @JoinColumn(name="VAL", referencedColumnName="VAL")},
            inverseJoinColumns= {@JoinColumn(name="NETWORK_TYPE", referencedColumnName="TYPE"), @JoinColumn(name="NETWORK_VAL", referencedColumnName="VAL")}
    )