Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:merge以DB为单位提供空值_Java_Hibernate_Fpml - Fatal编程技术网

Java Hibernate:merge以DB为单位提供空值

Java Hibernate:merge以DB为单位提供空值,java,hibernate,fpml,Java,Hibernate,Fpml,问题是如何发生的: 假设我有一个对象A,其中包含对象B的列表。 我首先坚持一个包含1b的A。 然后,我使用find检索这个对象A,将一个新对象B添加到它的列表中,并对A进行合并。 当我在对象a上进行查找时,第一个对象B得到了很好的持久化,但第二个对象只有空字段 请注意,这些B对象是FPML类的实例,由库的XML描述生成 如果我的解释遗漏了什么,请告诉我 更新: 问题发生在InstrumentId对象上 @Test public void testInstrumentIdPersi

问题是如何发生的:

假设我有一个对象A,其中包含对象B的列表。 我首先坚持一个包含1b的A。 然后,我使用find检索这个对象A,将一个新对象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>

仅当对象已保存在数据库中时,“合并”才起作用。Hibernate在其持久性包中查找对象。如果它不是相同的ID,那么您会得到一个错误

定义休眠文档: 将给定对象的状态复制到具有相同标识符的持久对象上。

因此,如果您首先保存对象。使用Session.saveOrUpdateObject A,您应该能够合并Object B

另请参见Session.save和Session.persist之间的区别。


请告诉我我的回答是否对您有帮助。

如果我的解释中缺少什么,请告诉我。恕我直言,你的解释遗漏了一切。发布一些代码作为开始。让我知道我的更新是否有帮助…是的,我认为它更好。也可以显示相关的映射。。。但是第二个只有空字段。所有领域?包括PK?您是如何检查字段是否为空的?您确定没有使用IDE调试器检查Hibernate代理吗?我添加了映射文件。事实上,当合并出现问题时,Hibernate抱怨值字段不能为空,因为主键的一部分。在这种情况下,我实际上有一个较长的对象组合链C有一个a列表,其中有一个B列表。如果我保留一个C,那么将somme a添加到其中并合并它,它可以正常工作,不包括任何B。因此,合并可以正常工作,但我会尝试在保存我的B之前,看看它是否正常工作,谢谢。好的,太好了,当坚持我的B第一次它正常工作。奇怪,因为我可以在不保存A的情况下将我的C与新A合并在一起。也许现在我也不得不先省下我的钱。我会让你知道的。
@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;