使用compositeKey的Hibernate示例OneToMany

时间:2009-06-17 18:21:24

标签: java hibernate orm

您能否举例说明以下情况的Hibernate映射:

  1. 包含简单主键(foo
  2. 的父表(foo_id
  3. 子表(bar),其复合键由

    组成

    a)父表的外键(foo_id

    b)类型字符串

  4. 的键(item
  5. 许多孩子有一个父母
  6. Parent类将有一个Child对象列表
  7. 保存,更新,删除父类时,更改将级联到子项

2 个答案:

答案 0 :(得分:4)

我还没有完全按照你的要求行事,但这可能会让你朝着正确的方向前进。我认为它应该有效。这个page更详细地解释了这些注释。

@Entity
public class Foo {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId(){

    }
    ...
    @OneToMany(mappedBy="foo")
    public Collection<Bar> getBars() {

    }


...
}


@Entity
@IdClass(BarPk.class)
public class Bar implements Serializable {
    @ManyToOne
    @JoinColumn(name="foo")
    @Id
    public Foo getFoo() {
        return foo;
    }

    @Column(name="key", length=255)
    @Id
    public String getKey(){

    }

}


@Embeddable
public class BarPk implements Serializable {
    public Foo getFoo() {
        return foo;
    }
    public void setFoo(Foo foo) {

    }
    public String getKey(){
    ...
    }   

    public void setKey(String key){
    ...
    }     

    //you must include equals() and hashcode()    
}

答案 1 :(得分:0)

是的,您应该使用以下映射

@Entity 公共课家长{

@Id
private Integer id;

@CollectionOfElements
@JoinTable(
    name="Child",
    joinColumn=@JoinColumn(name="PARENT_ID"))
@IndexColumn("childIndex")
private List<Child> childList = new ArrayList<Child>();

}

注意@CollectionOfElements和IndexColumn是Hibernate特定的注释,而不是JPA 1.0规范。 JPA 2.0将介绍它们。

@Embeddable 公共课儿童{

// @Embeddable class does not contains identifiers 
// child class specific property's

}

因此以下代码可以正常使用

父母=新父母();

parent.getChildList()。add(new Child()); parent.getChildList()。add(new Child()); //其他孩子

session.save(父); //将保存父母和两个孩子

此问题的缺点是@CollectionOfElements注释仅适用于@Embeddadble类,而不适用于Entity类。如果您想将Child类作为Entity类,我希望看到解决方案。不可能同时将@Entity和@Embeddable注释应用于类。

此致 Arthur Ronald F D Garcia(Java程序员) 纳塔尔/ RN - 巴西