我有一个名为"属性"的表。它具有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中的可空字段。结果是腐败。
非常感谢!
答案 0 :(得分:2)
自you must not use null in your PK以来,您应该这样做:
您仍然可以使用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;