组合如何在Hibernate中运行?

时间:2010-11-26 11:22:59

标签: java hibernate composition

我正在尝试在注释中使用hibernate中的组合。

我有:

@Entity
@Table(name = "Foo")
public class Foo {
    private Bar bar;

    public void setBar(Bar bar){...}
    public Bar getBar() {...)
}

public class Bar {
  private double x;

  public void setX(double x) {...}
  public double getX() {...}
}

当试图保存Foo时,我正在

  

无法确定实体的类型   org.bla.Bar在表Foo的列:   [org.hibernate.mapping.Column(巴)]

我尝试在Bar上放一个@Entity注释,但这让我:

  

没有为实体指定标识符   org.bla.Bar

3 个答案:

答案 0 :(得分:4)

你需要明确Foo和Bar之间的关系(比如@ManyToOne或@OneToOne)。

或者如果Bar不是自己的实体,则用@Embeddable标记它,并将@Embedded添加到Foo中的变量声明。

@Entity
@Table(name = "Foo")
public class Foo {
    @Embedded
    private Bar bar;

    public void setBar(Bar bar){...}
    public Bar getBar() {...)
}

@Embeddable
public class Bar {
  private double x;

  public void setX(double x) {...}
  public double getX() {...}
}

@see:http://www.vaannila.com/hibernate/hibernate-example/hibernate-mapping-component-using-annotations-1.html - 该示例展示了@Embeddable add @Embedded Composit方式,其中Foo和Bar(在示例中:Student和Address)映射在同一个表中。

答案 1 :(得分:2)

该机制在参考文档的这一部分中描述:

5.1.5. Embedded objects (aka components)

显然hibernate为此目的使用JPA注释,因此解决方案referred to by Ralph是正确的

简而言之:

如果您将课程Address标记为@Embeddable并将类型Address的属性添加到课程User,则将该属性标记为@Embedded,然后生成的数据库表User将包含Address指定的所有字段。

请参阅Ralph对代码的回答。

答案 2 :(得分:0)

每个简单实体必须标记为实体(带@Entity)并且标识符(主要是Long)作为主键。必须使用相应的关联注释(@OneToOne@OneToMany@ManyToMany)声明每个非基本关联/组合。我建议你仔细阅读Hibernate Getting Started Guide。请尝试以下操作使代码示例正常工作

@Entity
public class Foo {
    @Id
    @GeneratedValue
    private Long id;

    @OneToOne
    private Bar bar;

    // getters and setters for id and bar
}

@Entity
public class Bar {
    @Id
    @GeneratedValue
    private Long id;

    private double x;

    // getters and setters for id and x
}