Как работает композиция в Hibernate? - PullRequest
2 голосов
/ 26 ноября 2010

Я пытаюсь использовать композицию в спящем режиме с аннотациями.

У меня есть:

@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 в Bar, но я получаю:

Не указан идентификатор для объекта org.bla.Bar

Ответы [ 3 ]

4 голосов
/ 26 ноября 2010

Вам необходимо указать отношения между 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 and Address) отображаются в одной таблице.

2 голосов
/ 26 ноября 2010

Механизм описан в этом разделе справочных документов:

5.1.5. Внедренные объекты (или компоненты)

Очевидно, hibernate использует аннотации JPA для этой цели, поэтому решение , на которое ссылается Ральф , является правильным

В двух словах:

если вы пометите класс Address как @Embeddable и добавите свойство типа Address к классу User, отметив это свойство как @Embedded, то в результирующей таблице базы данных User будут все поля указано Address.

См. Ответ Ральфа для кода.

0 голосов
/ 26 ноября 2010

Каждая простая сущность должна быть помечена как сущность (@Entity) и иметь идентификатор (чаще всего Long) в качестве первичного ключа. Каждая не примитивная ассоциация / композиция должна быть объявлена ​​с соответствующей аннотацией ассоциации (@OneToOne, @OneToMany, @ManyToMany). Я предлагаю вам прочитать Руководство по началу работы в Hibernate . Попробуйте следующее, чтобы ваш пример кода работал

@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
}
...