JPA Embeddeble PK和可空字段

时间:2014-05-23 09:03:27

标签: java hibernate jpa orm hibernate-mapping

我有一个名为"属性"的表。它具有3个字段的PK,可以为空。在这种情况下,Style_no不为null,但item_no和size_no为空。

是否可以使用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;

OR

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="STYLE_NO", referencedColumnName="STYLE_NO")
private List<Attribute> attributes;

当我删除item_no和size_no为pk我收到有效结果时。

编辑: 使我的问题更具体。是按照JPA指南还是&#34;常识&#34;不允许为EmbeddebedId使用可空字段?如果没有,我需要添加什么注释或逻辑才能使其工作而不添加另一个PK? 一旦用PK填充PK中的可空字段。结果是腐败。

非常感谢!

4 个答案:

答案 0 :(得分:2)

you must not use null in your PK以来,您应该这样做:

  1. 添加surrogate primary key
  2. 您仍然可以使用parial索引(在PostgreSQL中)实现唯一性约束和默认PK索引:

    CREATE UNIQUE INDEX style_item_size_idx ON my_table(Style_no,item_no,size_no)WHERE(item_no IS NOT NULL且size_no IS not NULL);

答案 1 :(得分:1)

看看here 似乎,答案是(NULL == NULL) - &gt;是关于你的问题。

答案 2 :(得分:0)

通常不允许化合物pk在数据库中具有空值。

从技术上讲,我们会说:为什么不呢,null也可以是一个值。

DB-Analyst会问:好吧,如果我排序1,2,3,4,null,5。你会说null是在1之前还是在5之后?

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

答案 3 :(得分:0)

JPA指南或&#34;常识&#34;不允许为EmbeddebedId使用可空字段?如果没有,我需要添加什么注释或逻辑才能使其工作而不添加另一个PK?

答案如下

@EmbeddedId
private AttributePK attrPK;

不允许主键为空。

所以为了实现它,请使用下面的另一个注释

@IdClass(AttributePK.class)
 private AttributePK attrPK;