Java JPA Embeddeble PK和可空字段
我有一个名为“Attributes”的表,它的主键是3个字段,可以为null。在这种情况下,样式号不为空,但项目号和大小号为空 是否可能有一个字段可以为空的Embeddeble PKJava 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
@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;
因为,这是你应该做的:
谢谢你的链接。但正如下面的评论正确地提到的,这并不令人满意。例如,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})
,你怎么能把它放在纸上