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