@OneToMany和复合主键?

8 浏览
0 Comments

@OneToMany和复合主键?

我在Spring中使用带注解的Hibernate,我有一个对象,它与一个子对象具有有序的多对一关系,子对象具有复合主键,其中一个组成部分是指向父对象id的外键。

结构大致如下:

+=============+ +================+

| 父对象 | | 子对象 |

+-------------+ 1 0..* +----------------+

| id (pk) |-----------------| parentId |

| ... | | name |

+=============+ | pos |

| ... |

+================+

我尝试了各种注解的组合,但没有一个似乎起作用。这是我能想到的最接近的:

@Entity
public class ParentObject {
    @Column(nullable=false, updatable=false)
    @Id @GeneratedValue(generator="...")
    private String id;
    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
    @IndexColumn(name = "pos", base=0)
    private List attrs;
    ...
}
@Entity
public class ChildObject {
    @Embeddable
    public static class Pk implements Serializable {
        @Column(nullable=false, updatable=false)
        private String parentId;
        @Column(nullable=false, updatable=false)
        private String name;
        @Column(nullable=false, updatable=false)
        private int pos;
        @Override
        public String toString() {
            return new Formatter().format("%s.%s[%d]", parentId, name, pos).toString();
        }
        ...
    }
    @EmbeddedId
    private Pk pk;
    @ManyToOne
    @JoinColumn(name="parentId")
    private ParentObject parent;
    ...
}

经过长时间的尝试和实验后,我得到了这个结果,其中大部分尝试都导致Hibernate无法加载实体的各种原因。

更新:感谢大家的评论,我取得了一些进展。我进行了一些微调,我觉得已经更接近了(我已经更新了上面的代码)。现在,问题是在插入时。父对象似乎保存得很好,但子对象没有保存,我能确定的是Hibernate没有填充子对象的(复合)主键的parentId部分,所以我得到了一个不唯一的错误:

org.hibernate.NonUniqueObjectException:
   a different object with the same identifier value was already associated 
   with the session: [org.kpruden.ObjectChild#null.attr1[0]]

我在自己的代码中填充了name和pos属性,但是当然我不知道父ID,因为它还没有保存。有没有办法说服Hibernate填充这个?谢谢!

0