JPA/Hibernate - Встраивание Атрибута

это должно работать ( документ ):

global $theme;
$path = drupal_get_path('theme', $theme);

// there's also a $theme_path global

global $theme_path;

8
задан mainstringargs 20 July 2009 в 20:35
поделиться

4 ответа

Наследование компонентов (например, @Embeddable) не поддерживается и, скорее всего, никогда не будет. Для этого есть веская причина - идентификатор объекта играет решающую роль во всех стратегиях наследования, поддерживаемых Hibernate, а компоненты не имеют (сопоставленных) идентификаторов.

У вас есть три варианта:

A) Сопоставить PartNumber (и все его потомки) как объекты. PartNumber может оставаться абстрактным:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="part_type", discriminatorType=DiscriminatorType.STRING)
public abstract class PartNumber {
...
}

@Entity
@DiscriminatorValue("Ford")
public class FordPartNumber extends PartNumber {
...
}

B) На основании вашего примера кажется, что все потомки PartNumber отличаются только поведением (они не вводят никаких новых свойств для сохранения). Если это действительно так, вы можете сопоставить свойства PartNumber плюс ваше собственное значение дискриминатора (чтобы вы знали, какой класс создать экземпляр) как частное свойство @Embedded и иметь аксессоры get / setPartNumber () в классе Part для маршаллинга / демаршаллинга соответствующих подклассов. Вы даже можете написать свой собственный пользовательский тип Hibernate, чтобы сделать это за вас (это довольно просто).

C) Если потомки PartNumber действительно различаются по свойствам, которые должны быть сохранены, и сопоставление их как сущностей неприемлемо по какой-либо причине, вы можете используйте marshall / unmarshall их в строку (как XML или что-нибудь еще, что соответствует закону) и сохраните это. Я использую XStream именно для этой цели и написал для него простой тип Hibernate. Ваше отображение Part будет выглядеть примерно как

@Type(type="xmlBean")
public PartNumber getPartNumber() {
    return partNumber;
}
public void setPartNumber(PartNumber partNumber) {
    this.partNumber = partNumber;
}

, и потомки PartNumber не должны отображаться вообще. Обратной стороной, конечно же, является то, что работа с XML в базе данных немного сложнее, так что это может быть не идеальным подходом для того, о чем вам, возможно, придется сообщить. OTOH, I '

15
ответ дан 5 December 2019 в 08:54
поделиться

Хм, не уверен. Вы пробовали поставить @MappedSuperclasson PartNumber и @Embeddable на подклассах. См. Также - https://forum.hibernate.org/viewtopic.php?t=966129

В качестве побочного узла - рассматривали ли вы возможность использования Hibernate Validator вместо собственного метода проверки?

1
ответ дан 5 December 2019 в 08:54
поделиться

В общем, подумайте о том, какие объекты задействованы в торговом автомате:

  • VendingMachine - возможно, абстрактный класс
  • DrinkMachine , SnackMachine , и классы, расширяющие VendingMachine
  • VendingProduct - абстрактный класс?
  • Drink , другие классы, расширяющие VendingProduct
  • Coke , другие классы, расширяющие Drink
  • и т. Д. И т. Д.

Но я уверен, что вы легко это поймете. Гайки и болты машины будут относиться к некоему вспомогательному классу с методами приема банкнот и монет, расчета сдачи и т. Д.

Дополнительная литература:

  • Здесь хорошая статья для начала Дизайн ООП, автор Аллен Голуб.
  • Здесь - начало проектирования торгового автомата с использованием ООП.
2
ответ дан 5 December 2019 в 08:54
поделиться

Похоже, вы пытаетесь использовать «Embedable Inheritance», которое, как мне кажется, еще не поддерживает спящий режим.

@Embeddable
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="partType", discriminatorType=DiscriminatorType.STRING)
public PartNumber getPartNumber() 
{
  return partNumber;
}

Поскольку похоже, что разница между Фордом и Шеви выглядит как формат. Я бы, вероятно, спрятал сопоставление и добавил бы другую функцию для возврата нужного вам типа.

@Embeddable
public PartNumber getPartNumber() 
{
  return partNumber;
}

@Transient
public SpecificPartNumber getSpecificPartNumber()
{
  return PartNumberFactory.create( getPartNumber() );
}

Смотрите ссылки в комментариях ...

1
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: