2015-09-11 6 views
0

Вот как проблема возникает:Hibernate: слияние дает нулевые значения в БД

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

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

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

Update:

Проблема возникает с объектами 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; 
+0

_ «Пожалуйста, дайте мне знать, если в моем объяснении чего-то не хватает». _ При всем моем уважении все в вашем объяснении отсутствует. Поместите некоторый код для начала. –

+0

дайте мне знать, если мое обновление поможет ... – Oleg

+0

Да, это гораздо лучше, я думаю. Было бы не больно показывать соответствующие сопоставления. _ "... но второй имеет только нулевые поля." _ Все поля? В том числе ПК? Как вы проверили, что поля «null» (вы уверены, что не проверяли прокси-сервер Hibernate с отладчиком IDE)? –

ответ

-1

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

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

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

Также см. Разницу между Session.save() и Session.persist(). Difference save and persist.

pls сообщите мне, если мой ответ вам помог.

+0

В этом случае у меня на самом деле есть более длинная цепочка объектов (C имеет список A, который имеет список B). Если я сохраню C, добавьте somme A к нему и объедините его, он отлично работает (не включая B). Так что слияние прекрасно работает, но я попытаюсь сохранить мой B раньше и посмотреть, работает ли это, спасибо. – Oleg

+0

хорошо, когда я продолжаю свой B, сначала он отлично работает. Странно, так как я мог объединить мой C с новым A в нем, не сохраняя A раньше. Возможно, теперь я буду обязан также сохранить свой А первый. Я дам Вам знать. – Oleg

Смежные вопросы