I'm trying to use composition in hibernate with annotations.
I have:
@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() {...}
}
And when trying to save Foo, I'm getting
Could not determine type for entity org.bla.Bar at table Foo for columns: [org.hibernate.mapping.Column(bar)]
I tried putting an @Entity annotation on Bar, but this gets me:
No i开发者_高级运维dentifier specified for entity org.bla.Bar
The mechanism is described in this section of the reference docs:
5.1.5. Embedded objects (aka components)
Apparently hibernate uses JPA annotations for this purpose, so the solution referred to by Ralph is correct
In a nutshell:
if you mark a class Address as @Embeddable and add a property of type Address to class User, marking the property as @Embedded, then the resulting database table User will have all fields specified by Address.
See Ralph's answer for the code.
You need to specifiy the relationship between Foo and Bar (with something like @ManyToOne or @OneToOne).
Alternatively, if Bar is not an Entity, then mark it with @Embeddable, and add @Embedded to the variable declaration in 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: https://www.baeldung.com/jpa-embedded-embeddable -- The example expains the @Embeddable and @Embedded Composite way, where Foo and Bar (Company and ContactPerson in the example) are mapped in the same Table.
Each simple entity must be marked as an entity (with @Entity) and have an identifier (mostly a Long) as a primary key. Each non-primitive association/composition must be declared with the corresponding association annotation (@OneToOne, @OneToMany, @ManyToMany). I suggest you read through the Hibernate Getting Started Guide. Try the following to make your code example work
@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
}
加载中,请稍侯......
精彩评论