Если вы сделаете IsHarmfulToEat
контравариантным, следующий код скомпилирует
trait Food
trait Plentiful
trait IsHarmfulToEat[-F <: Food]
object IsHarmfulToEat {
implicit def ignoreSupply[F <: Food]
(implicit isHarmful: IsHarmfulToEat[F]
): IsHarmfulToEat[F with Plentiful] =
new IsHarmfulToEat[F with Plentiful]{}
}
case class Cake() extends Food {}
object Cake {
implicit val isBad: IsHarmfulToEat[Cake] = new IsHarmfulToEat[Cake] {}
}
object FoodTest extends App {
val ignoreSupplyDoesWork: IsHarmfulToEat[Cake with Plentiful] =
IsHarmfulToEat.ignoreSupply[Cake]
val badCake = implicitly[IsHarmfulToEat[Cake]]
val manyBadCakes = implicitly[IsHarmfulToEat[Cake with Plentiful]]
}
Первой остановкой, как уже упоминалось, должна быть попытка сжать / восстановить базу данных. Однако вы также можете немного сэкономить размер, создав новую базу данных и импортировав все объекты из старой. Кроме того, преобразование его в MDE должно дать вам больше волос. Как всегда, не играйте с производственной копией. Кроме того, если вы используете MDE, сначала убедитесь, что вы правильно разбили базу данных. (И, конечно, сохраните копию исходного MDB на случай, если в будущем вам потребуются изменения.)
Мы все еще пытаемся разработать некоторые четкие эвристики, когда мы используем один механизм конфигурации вместо другого, но мы приближаемся к цели.
Сущности JPA, представляющие собой просто Java Beans (классы, определяющие геттеры и сеттеры) с дополнительным вспомогательным кодом (конструкторы, hashCode, equals, именованные запросы, методы копирования, что еще?), Вряд ли можно считать загрязненными даже со всеми типами аннотаций JPA.
Настоящей целью разделения метаданных между аннотациями Java и xml было бы упрощение и оптимизация политик развертывания. Цена, которую вы понесете, двоякая:
Оба являются довольно серьезными соображениями при работе в средней и большой группе разработчиков.
Если перекомпиляция для изменений базы данных представляет собой значительную проблему в процессе развертывания, то это звучит как разумный подход. Но цена будет заключаться в более сложной среде разработки и политиках процессов и обслуживания.