Нет столбца дискриминатора в стратегии СОЕДИНЕННОГО наследования - PullRequest
0 голосов
/ 12 сентября 2018

РЕДАКТИРОВАТЬ - Это решено: ProJPA2 заявляет, что некоторые поставщики персистентности реализуют стратегию JOINED без столбца дискриминатора. Спасибо тем, кто оставил ответы на мой вопрос.


У меня есть простая установка, в которой используется стратегия наследования JOINED, но я озадачен: почему, в отличие от того, что я читаю о стратегии соединения, в Интернете и в ProJPA2, в моем сгенерированном столбце нет дискриминатора DDL.

Интересно, есть такой вопрос на SO: Почему EclipseLink добавляет столбец дискриминатора для стратегии объединенного наследования?

, который спрашивает, почему eclipselink добавляет столбец дискриминатора, когда (по мнению OP) это не нужно. Мой небольшой тест работает нормально, данные сохраняются правильно, все работает, что, кажется, подтверждает точку зрения опрашивающего, и все же у меня нет столбца дискриминатора ни в одной из моих таблиц. У меня есть только FK для родительской таблицы (суперкласса) из каждой дочерней таблицы (подкласса).

Для простоты я использую eclipse, eclipselink 2.5.x, mysql, и это среда Java SE JPA. Где-то я использую hibernate, потому что я записываю кучу вещей hibernate, например

 17:44:14 INFO  [org.hibernate.Version].logVersion - HHH000412: Hibernate Core {5.2.17.Final}

но я не могу вспомнить, где находится этот параметр в проекте, и мне нужно уйти сейчас.

Все идеи приветствуются. Благодарю.

Фрагменты кода:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public class Order {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int id;
    private String name;
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;
...
}



@Entity
public abstract class ShoppingOrder extends Order {
    private String shopName;
   ...
}


@Entity
public class SuperMarketShoppingOrder extends ShoppingOrder {

private String supermarketName;
...
}


@Entity
public class EuroSuperMarketShoppingOrder extends SuperMarketShoppingOrder {
    private String country;
...
}

Сгенерированный DDL:

CREATE TABLE `shoppingorder` (
  `id` int(11) NOT NULL,
  `date` datetime(6) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `shopName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `supermarketshoppingorder` (
  `supermarketName` varchar(255) DEFAULT NULL,
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FKg6ui4gndl8m9ouut2sb1g8xmm` FOREIGN KEY (`id`) REFERENCES `shoppingorder` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `eurosupermarketshoppingorder` (
  `country` varchar(255) DEFAULT NULL,
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK2g6xgprpajjl3msv9rm00gi1f` FOREIGN KEY (`id`) REFERENCES `supermarketshoppingorder` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я только что видел это в своей книге ProJPA2, которая проясняет этот вопрос - мне жаль, что я не заметил этого раньше:

book

0 голосов
/ 12 сентября 2018

Ваше отображение неверно.

У вас есть

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)

MappedSuperclass используется для того, чтобы все поля суперкласса были в подклассах, а Inheritance - это "настоящее" отображение наследования..

Таким образом, вы должны удалить @ MappedSuperclass.

Но это был не ваш вопрос.

Создавали ли вы запросы, выполняющие запросы на уровне суперкласса, а также на подпрограммеУровень класса?

Это тоже работает?

Можно предположить, что это не сработает.

EclipseLink использует столбец дискриминатора, чтобы определить, какой тип подкласса,Hibernate делает то же самое с оператором case.

Скажите, пожалуйста, работает ли запрос.Благодаря.

...