Java JPA Embeddeble PK和可空字段

Java JPA Embeddeble PK和可空字段,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,我有一个名为“Attributes”的表,它的主键是3个字段,可以为null。在这种情况下,样式号不为空,但项目号和大小号为空 是否可能有一个字段可以为空的Embeddeble PK @Entity @Table(name="ATTRIBUTE") public class Attribute { @EmbeddedId private AttributePK attrPK; ... @Embeddable public static class At

我有一个名为“Attributes”的表,它的主键是3个字段,可以为null。在这种情况下,样式号不为空,但项目号和大小号为空

是否可能有一个字段可以为空的Embeddeble PK

@Entity
@Table(name="ATTRIBUTE")
public class Attribute {

    @EmbeddedId
    private AttributePK attrPK;
    ...

    @Embeddable
    public static class AttributePK implements Serializable{

        private static final long serialVersionUID = -2976341677484364274L;

        @Column(name="STYLE_NO", nullable=true)
        protected String styleNo;

        @Column(name="ITEM_NO", nullable=true)
        protected String itemNo;

        @Column(name="SIZE_NO", nullable=true)
        protected String sizeNo;
    ...
当我尝试引用一个字段时,例如style_no,结果量为0

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="attrPK.styleNo")
@MapKey(name="attrPK.name")
public Map<String,Attribute> attributesX;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,orphandremovation=true,mappedBy=“attrPK.styleNo”)
@MapKey(name=“attrPK.name”)
公共地图属性;

@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“STYLE\u NO”,referencedColumnName=“STYLE\u NO”)
私有列表属性;
当我删除项目号和大小号作为主键时,我收到一个有效的结果

编辑: 让我的问题更具体。根据JPA指南或“常识”是否不允许为EmbeddeBedd使用可空字段?如果没有,我需要添加什么注释或逻辑才能在不添加其他PK的情况下工作? 一旦用值填充PK中的可空字段。结果是正确的

多谢各位

看一看 看起来,(NULL==NULL)->false的答案与您的问题有关。

看一看
似乎,(NULL==NULL)->false的答案与您的问题有关。

通常复合pk在数据库中不允许有NULL值

从技术上讲,我们会说:
null
也可以是值

DB分析员会问:好的,如果我对1,2,3,4进行排序,
null
,5。您认为
null
是在1之前还是在5之后


因此,PostgreSQL、Oracle、MySQL将不支持复合主键中的空值。

通常,复合主键在数据库中不允许有空值

从技术上讲,我们会说:
null
也可以是值

DB分析员会问:好的,如果我对1,2,3,4进行排序,
null
,5。您认为
null
是在1之前还是在5之后

因此,PostgreSQL、Oracle、MySQL将不支持复合主键中的空值。

JPA指南或“常识”不允许对EmbeddeBeId使用可空字段?如果没有,我需要添加什么注释或逻辑才能在不添加其他PK的情况下工作

答案如下

@EmbeddedId
private AttributePK attrPK;
不允许主键为空

因此,要实现这一点,请使用下面的另一个注释

@IdClass(AttributePK.class)
 private AttributePK attrPK;
JPA指南或“常识”不允许为EmbeddeBedd使用可空字段?如果没有,我需要添加什么注释或逻辑才能在不添加其他PK的情况下工作

答案如下

@EmbeddedId
private AttributePK attrPK;
不允许主键为空

因此,要实现这一点,请使用下面的另一个注释

@IdClass(AttributePK.class)
 private AttributePK attrPK;
因为,这是你应该做的:

  • 添加一个
  • 您仍然可以使用对等索引(在PostgreSQL中)实现唯一性约束和默认PK索引:

    在my_表(style_no,item_no,size_no)上创建唯一索引样式_item_size_idx,其中(item_no不为NULL,size_no不为NULL)

  • 因为,这是你应该做的:

  • 添加一个
  • 您仍然可以使用对等索引(在PostgreSQL中)实现唯一性约束和默认PK索引:

    在my_表(style_no,item_no,size_no)上创建唯一索引样式_item_size_idx,其中(item_no不为NULL,size_no不为NULL)


  • 谢谢你的链接。但正如下面的评论正确地提到的,这并不令人满意。例如,JPA不允许在可以为空的字段上使用Id。但是对于EmbeddedId,我找不到相同的限制。我所需要的是,如果有一个解决方案,而不添加另一个人工Id或指向源的链接,该源表示EmbeddedId中不允许有空字段。谢谢您的链接。但正如下面的评论正确地提到的,这并不令人满意。例如,JPA不允许在可以为空的字段上使用Id。但是对于EmbeddedId,我找不到相同的限制。我所需要的是,如果有一个解决方案,而不添加另一个人工Id或指向源的链接,该源表示EmbeddedId中不允许有空字段。1)对于顺序,我想说DB可以自己决定。从技术上讲,在任何地方定义它都很重要。2) 是的,不允许使用PK合同。对于唯一约束,它是允许的,但它仍然不能与hibernate一起工作。@如果你是对的,我添加了2。单词from last:
    primary
    清除键和primarykeys之间的差异。1)对于顺序,我认为DB可以自行决定。从技术上讲,在任何地方定义它都很重要。2) 是的,不允许使用PK合同。对于唯一约束,它是允许的,但它仍然不能与hibernate一起工作。@如果你是对的,我添加了2。上一句话:
    primary
    清除键和primarykeys之间的差异。谢谢你,但我明确提出了一个解决方案,不添加另一个id-“。它可以在不添加另一个PK的情况下工作…”。我理解,只是这是一个需要注意的DB限制。当然,我上面的exmaple只是为了了解Hibernate,作为一个额外的层,可以避免这种特定于DB的边界。没有真正的用例。我总是选择Hibernate,否则我只会使用具有强大查询能力的。谢谢你,但是,我明确要求一个解决方案,不添加另一个id-“。它在不添加另一个PK的情况下工作…”。我理解,只是这是您需要注意的DB限制。当然,我上面的exmaple只是想看看Hibernate作为一个额外的层是否可以避免这种特定于DB的边界。没有真正的用例。我总是选择Hibernate,否则我只会使用具有强大查询能力的。谢谢,我明天会尝试验证它。IdClass有一个
    @Target({ElementType.TYPE})
    ,你怎么能把它放在字段上???谢谢,我明天会尝试验证它。IdClass有一个
    @Target({ElementType.TYPE})
    ,你怎么能把它放在纸上