JPA OneToMany и ManyToOne с составным ключом генерируют третью таблицу - PullRequest
0 голосов
/ 27 декабря 2011

Я сопоставляю Filter ---

@Entity
public class Filter implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String name;
    private String caption;
    @OneToMany(cascade = CascadeType.MERGE, targetEntity = FilterColumn.class)
    private Set<FilterColumn> columns;

    // setters and getters

}



@Entity
public class FilterColumn implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private FilterColumnId id;
    private String caption;

    // getters and setters

@Embeddable
public static class FilterColumnId implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManyToOne
    private Filter filter;
    @Column
    private String name;

    // getters and setters

}


}

Но когда я запускаю приложение с инструкцией drop-create, создаются следующие 3 таблицы: Фильтр ПК (имя) FilterColumn PK (имя_фильтра, имя) Filter_FilterColumn PK (filter_filter_name, filterColumn_filter_name, filterColumn_name)

Что я действительно хочу, так это две таблицы, например: Фильтр ПК (имя) Filter_Column PK (имя, имя_фильтра)

Почему я получаю этот результат? Что-то не так с моим отображением? Что я должен изменить?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Я думаю, вам нужно mappedBy на @OneToMany. Без этого маппер не знает, что он может взглянуть на таблицу filtercolumn, чтобы найти сущности, связанные с Filter, поэтому он генерирует таблицу filter_filtercolumn.

Не уверен с моей головы, как тебе mappedBy с составным ключом. Учитывая, что вы используете @EmbeddedId, я думаю, что это просто mappedBy = "id".

Можете ли вы использовать @ManyToOne в таком ключевом классе? Это расширение Hibernate сверх спецификации JPA? Разве вам не нужно где-то там @MapsId?

0 голосов
/ 27 декабря 2011

Попробуйте добавить аннотацию @JoinColumn к элементу Filter вашего составного идентификатора. Фактический столбец будет таким, каким является идентификатор таблицы Filter (или просто оставьте его без имени, если вы позволите hibernate генерировать все это).

Дайте мне знать, если это работает, так как у меня была похожая проблема, и я решил ее, используя вышеописанное, так что я знаю, что это возможно. Единственное, что у меня есть, - это @ForeignKey аннотация, но я думаю, что hibernate позаботится об этом за вас - я сделал это только потому, что хотел придерживаться соглашения об именах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...