Отображение однонаправленной ассоциации OneToMany на объект-оболочку с использованием JPA - PullRequest
0 голосов
/ 18 октября 2011

Я конвертирую конфигурацию Hibernate в использование JPA. Текущая конфигурация имеет класс AlertPref (таблица ALERT_PREF) с коллекцией типов Long, которые являются значениями первичного ключа из таблицы ALERT_CATEGORY. Существует таблица соединений ALERT_PREF_CATEGORY, которая соединяет эти две. Я мог бы установить это отношение в JPA, определив соединительную таблицу как класс Entity и имея коллекцию объектов AlertPrefCategory вместо длинных идентификаторов в классе AlertPref, но я хочу избежать этого, если это возможно, и вместо этого настроить однонаправленное отображение из AlertPref для длинных идентификаторов. Некоторые устаревшие коды используют идентификаторы, и было бы сложно изменить этот код.

Вот текущий тег класса в конфигурации Hibernate, который отлично работает:

<class name="AlertPref" table="ALERT_PREF">
    <id name="alertPrefId" column="ALERT_PREF_ID" type="long">
        <generator class="hilo">
            <param name="max_lo">100</param>
        </generator>
    </id>

    <property name="userId" column="USER_ID" type="string"
        not-null="true" />

    <set name="excludedCategoryIds" table="ALERT_PREF_CATEGORY" cascade="all,delete-orphan">
        <key column="ALERT_PREF_ID" />
        <element column="EXCLUDED_CATEGORY_ID" type="long" />
    </set>

</class>

Вот то, что я пытался использовать в JPA, но оно выдает исключение «Использование @OneToMany или @ManyToMany для таргетинга на не отображенный класс: AlertPref.excludedCategoryIds [java.lang.Long]»

@Entity
@Table(name = "ALERT_PREF")
public class AlertPref {
    @Id
    @TableGenerator(name = "table_gen", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen")
    @Column(name = "ALERT_PREF_ID")
    private long alertPrefId;

    @Column(name = "USER_ID", nullable = false)
    private String userId;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "ALERT_PREF_CATEGORY", 
        joinColumns = @JoinColumn(name = "ALERT_PREF_ID"), 
        inverseJoinColumns = @JoinColumn(name = "EXCLUDED_CATEGORY_ID"))
    private Set<Long> excludedCategoryIds;

    /**
     * @return Returns the alertPrefId.
     */
    public long getAlertPrefId() {
        return alertPrefId;
    }

    /**
     * @param alertPrefId
     *            The alertPrefId to set.
     */
    public void setAlertPrefId(long alertPrefId) {
        this.alertPrefId = alertPrefId;
    }

    /**
     * @return Returns the userId.
     */
    public String getUserId() {
        return userId;
    }

    /**
     * @param userId
     *            The userId to set.
     */
    public void setUserId(String userId) {
        this.userId = userId;
    }

    /**
     * @return the excludedCategoryIds
     */
    public Set<Long> getExcludedCategoryIds() {
        return excludedCategoryIds;
    }

    /**
     * @param excludedCategoryIds the excludedCategoryIds to set
     */
    public void setExcludedCategoryIds(Set<Long> excludedCategoryIds) {
        this.excludedCategoryIds = excludedCategoryIds;
    }
}

1 Ответ

0 голосов
/ 19 октября 2011

Вы должны использовать аннотации ElementCollection и CollectionTable, как описано в справочной документации Hibernate .

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