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

标签 java jpa

我遇到的情况是,我有一个扩展 VCenterNetwork 的实体 VCenterDistributedVirtualPortgroup,并且两个实体在实体 VCenterFolder 内处于 OneToMany 关系。我收到以下错误:

由以下原因引起:org.h2.jdbc.JdbcSQLException:列“NETWORK_TYPE”不允许为 NULL; SQL语句: 插入folder_network(folder_type、folder_val、distributedVirtualPortgroups_type、distributedVirtualPortgroups_val)值(?、?、?、?)[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;}
    ...
}

VCenterDistributedVirtualPortgroup:

@Entity
@Table(name="distributedvirtualportgroup")
@DiscriminatorColumn(name="discriminator")
@DiscriminatorValue("DistributedVirtualPortgroup")
public class VCenterDistributedVirtualPortgroup extends VCenterNetwork
{
    @Transient
    private DistributedVirtualPortgroup distributedVirtualPortgroup;

    @Transient
    private static Map<MOR, VCenterDistributedVirtualPortgroup> distributedVirtualPortgroupMap = new TreeMap<MOR, VCenterDistributedVirtualPortgroup>();
    ...
}

VCenter文件夹:

@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

我是 JPA 新手,但我的猜测是 VCenterFolder-VCenterNetwork 和 VCenterFolder-VCenterDistributedVirtualPortgroup 都需要一个联接表,但由于 VCenterDistributedVirtualPortgroup 扩展了 VCenterNetwork,因此它正在构建一个具有两种关系但使用不同类型的联接表/每个关系的 val 对。我假设一次只会使用一对,另一对为空。这似乎是一个问题。在我看来,字段应该可以为空,或者两组类型/值对应该合并为一组。

我认为有某种方法可以解决这个问题,但我确实不知道它是什么。

最佳答案

MOR 恰好具有成员类型和 val,因此具有连接表中的名称。

我通过在网络和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")}
    )

关于java - 一个实体扩展另一个实体的连接表中的列不允许为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326456/

相关文章:

java - 使用 XmlPullParserFactory 解析 XML 在 while 语句中崩溃

java - 400 错误 "error_description": "Invalid grant_type: urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer" Google Service account

hibernate - 自动在 JPA 实体中设置 createdBy 和 updatedBy

java - JPA/hibernate 性能

java - Logback RollingFileAppender 不记录 Hibernate 消息

java - 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/JDBC_DBO]]

java - org.json.JSONException : End of input at character 0 of

java - Hibernate 可以在性能敏感的应用程序中使用吗?

java - Hibernate 忽略 fetchgraph

java - 某些标点字符与启用的 Pattern.UNICODE_CHARACTER_CLASS 标志不匹配