Отображение подкласса Jpa - PullRequest
0 голосов
/ 03 июня 2010

Я делаю POS-подобную систему. Интересно, как отобразить подкласс с использованием JPA (это для моего DAO). Класс Product содержит информацию о продукте, а класс OrderProduct содержит информацию о Product и сведения о заказе.

@Entity
@Table(name="products")
public class Product implements Serializable{
    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.AUTO
    public int getId(){ return id;}

    /**
     Other get/set methods
    */
}

@Entity
@Table(name="order_products")
public class OrderProduct extends Product{
        @Id
        @Column(name="id")
        @GeneratedValue(strategy = GenerationType.AUTO)
        public int getId(){ return id;}

        /**
         Other get/set methods
        */
}

Я получил жалобу на дубликат @Id. Но классу OrderProduct действительно нужен другой идентификатор, а не идентификатор продукта. Как мне это отобразить?

БД это что-то вроде

Table products
id int
name varchar(32)

Table order_product
id int
quantity int
productid int fk referencing product table

Поможет ли @IdClass или @AttributeOverride?

1 Ответ

1 голос
/ 03 июня 2010

Я не думаю, что то, чего вы хотели бы достичь, невозможно ни с помощью JPA, ни с Hibernate. При использовании стратегии объединенного подкласса PK подкласса является PK базового класса и используется для выполнения соединения между таблицами. Из спецификации JPA:

2.1.10.3 Стратегия присоединенного подкласса

В объединенной стратегии подкласса корень иерархии классов представлены одной таблицей. Каждый подкласс представлен отдельным таблица, содержащая те поля, которые являются специфичными для подкласса (не наследуется от своего суперкласса), как а также столбцы, которые представляют его первичный ключ. Первичный ключ столбец (ы) таблицы подклассов служит в качестве внешнего ключа к первичному ключу стол суперкласса .

Вы можете использовать @PrimaryKeyJoinColumn для изменения имени столбца в дочернем классе:

@Entity
@PrimaryKeyJoinColumn(name="PRODUCT_ID", referencedColumnName = "ID")
public class OrderProductTop extends ProductTop {
    ...
}

Но PRODUCT_ID все равно будет ПК.

И, честно говоря, я не понимаю вашу физическую модель. Для меня то, что вы в данный момент представляете, это отношение один-ко-многим, что не правильно (это должно быть отношение один к одному).

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