我正在尝试在注释中使用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
答案 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)
该机制在参考文档的这一部分中描述:
显然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
}