Hibernate: слияние дает нулевые значения в БД

Вот как возникает проблема:

скажем, у меня есть объект A, который содержит список объектов B. Сначала я сохраняю A, содержащий 1 B. Затем я извлекаю этот объект A (используя find), добавляю новый объект B в его список и объединяю A. Когда я делаю поиск по своему объекту A, мой первый объект B хорошо сохраняется, но второй имеет только нулевые поля.

Обратите внимание, что эти объекты B являются экземплярами класса FPML, сгенерированного из XML-описания библиотеки.

Пожалуйста, дайте мне знать, если что-то не хватает в моем объяснении.

Обновить:

Проблема возникает с объектами InstrumentId.

    @Test
    public void testInstrumentIdPersistenceAndUpdate () throws Exception {

        InstrumentId instrumentId = InstrumentIdUtils.produceInstrument("SX5E:IND", InstrumentIdScheme.BLOOMBERG);

        UnderlyingDefinition underlyingDefinition1 = new UnderlyingDefinition();
        underlyingDefinition1.setSymbol("SX5E:IND");
        underlyingDefinition1.setCurrency(CurrencyUtils.EUR);
        underlyingDefinition1.addInstrumentId(instrumentId);

        ProductDefinition productDefinition1 = new ProductDefinition("PUT");
        productDefinition1.addInstrumentDefinition(underlyingDefinition1);

        Universe universe = new Universe();
        universe.addProductDefinition(productDefinition1);
        universe.setName("channel.test-3");

        universe.setUri(new URI("urn:mapp3.channel.test-3"));

        entityManager.persist(universe);

        InstrumentId instrumentId1 = InstrumentIdUtils.produceInstrument("NES:IND", InstrumentIdScheme.BLOOMBERG);
        underlyingDefinition1.addInstrumentId(instrumentId1);

        entityManager.merge(universe);

        InstrumentId instrumentId2 = InstrumentIdUtils.produceInstrument("TOCH:IND", InstrumentIdScheme.BLOOMBERG);
        underlyingDefinition1.addInstrumentId(instrumentId2);

//        entityManager.merge(universe);

        Universe u = entityManager.find(Universe.class, "urn:mapp3.channel.test-3");


    }

файл отображения

<entity name="InstrumentId" class="org.fpml.v57.InstrumentId">

      <table name="T_INSTRUMENT_ID"/>

      <attributes>

         <id name="value" access="PROPERTY">
            <column name="VALUE" length="100"/>
         </id>

         <id name="instrumentIdScheme" access="FIELD">
            <column name="INSTRUMENT_ID_SCHEME" length="100"/>
         </id>

      </attributes>

   </entity>

вот сгенерированный pojo

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "InstrumentId", propOrder = {
    "value"
})
public class InstrumentId
    extends ModelObject
    implements Serializable
{

    @XmlValue
    @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
    protected String value;
    @XmlAttribute(name = "instrumentIdScheme", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String instrumentIdScheme;

1 ответ

Решение

Merge() работает, только если объект уже сохранен в базе данных. Hibernate ищет объект в своей сумке. Если его там нет (тот же идентификатор), вы получите сообщение об ошибке.

Определение Hibernate doc: "Скопировать состояние данного объекта в постоянный объект с тем же идентификатором". Session.merge()

так что если вы сначала сохраните объект А. с Session.saveOrUpdate(Объект A) тогда вы сможете объединить (Объект B).

Также просмотрите разницу между Session.save() и Session.persist(). Разница сохранить и сохранить.

Пожалуйста скажите мне, если мой ответ помог вам.

Другие вопросы по тегам