1

(原来的问题发生了变化,看到下面的更新。)休眠 - 使用一个包含父ID复合键 - 一对多

我有麻烦让休眠设置子对象的主键。主键与父母的主键相同。

这是父的样子:

@Entity 
@Table(name = "PARENT") 
@SequenceGenerator(name = "SEQ", allocationSize = 1, sequenceName = "seq_parent_id") 
public class Parent { 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ") 
    private Long id; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @Fetch(value = FetchMode.SUBSELECT) 
    @JoinColumn(name = "PARENT_ID") 
    private Set<Child> children; 

这是孩子的样子:

@Entity 
@Table(name = "CHILDREN") 
public class Child { 

    @Id 
    @Column(name = "PARENT_ID") 
    private Long parentId; 

现在,当我运行JUnit库测试,让我想保存父母实体与子实体,我得到的例外:

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ... 

什么是正确的方式让h ibernate自动将Child.parentId设置为parent.id?

我试着给孩子一个家长。但由于父母不是身份证,因此遇到其他例外情况。

UPDATE

我意识到,孩子的ID不是一个真正的主键。它只是一个映射关键。可以有一个parent.id的多个子条目。

更新

现在,我开始意识到我真正需要的:

孩子的主键是复合键出三个值:父ID和两个字符串值。

@Entity 
@Table(name = "CHILDREN") 
public class Child { 

    @Column(name = "PARENT_ID") 
    private Long parentId; 

    @Column(name = "PROPERTY_NAME") 
    private String propertyName; 

    @Column(name = "ANOTHER_PROPERTY") 
    private String anotherProperty; 

    @Column(name = "PROPERTY_VALUE") 
    private String propertyValue; 

所以我需要使用parentId,properyName和anotherProperty映射复合键。 propertyValue是该条目的实际值。

我想我可能需要使用IdClass或embeddedId。我尝试了,但迄今没有成功。

+1

您应该在关系的另一侧声明JoinColumn。在类Child中声明一个@ ManyToOne关系。但IMO,你有一个设计问题:如果一个'Parent'有多个'Child',Parent'如何可能是'Child'的主键? (几个'Child'将具有相同的'Parent'因此是相同的主键)。 –

+0

哦,你是对的。这不是真正的主键!这只是一个关键!该表没有真实的ID。 – Nina

回答

1

它可能取决于你想要的语义,但是如果孩子PK也是父母的FK,那么我会假设它表示一个IS-A类型的关系 - 或者,就数据库而言,CHILD是一个扩展表为父母。你可以把它设置为每类继承。

UPDATE

所以根据您的更新,在孩子的PARENTID是不是孩子的PK;这意味着它不应该使用@Id进行注释,并应该像其他任何FK一样进行设置。我会考虑不映射ParentID,而是映射Parent,尽管YMMV。

然后一个单独的问题是,什么(如果有的话 - 尽管如果没有,你可能会遇到麻烦)是孩子的独特ID?它是一个独立分配的代理吗?包含父ID的组合?或者是其他东西?所有这些情况都可以得到解决,但是如果没有更多关于您需要的信息,我可能无法详细说明每种可能性......

+0

不知道我是否正确理解了你,但我不会将它看作父表的扩展,因为父可以有许多子项。 – Nina

+0

如果父母可以有多个孩子,那么子表上的PK不能是父母PK的FK。 –

+0

没关系,我看到你的问题更新... –