Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 为什么在实体持久化时设置属性?_Java_Spring_Hibernate_Jpa_Persistence - Fatal编程技术网

Java 为什么在实体持久化时设置属性?

Java 为什么在实体持久化时设置属性?,java,spring,hibernate,jpa,persistence,Java,Spring,Hibernate,Jpa,Persistence,当我持久化JPA Hibernate创建的新实体时,会调用一些setter方法。为什么?Hibernate必须读取所有属性,但为什么要将值(而不是ID)设置回实体 代码 输出 弹簧配置 实体映射 图书馆版本 java 1.6.0_29 Hibernate3.6.0 弹簧3.0.5 在Hibernate源代码中可以很容易地找到这个stacktrace答案 为了保存对象,Hibernate从中提取状态。在“按自定义保存”过程中,可以更改提取的状态,或为“版本”字段赋值。如果状态已更改,Hibern

当我持久化JPA Hibernate创建的新实体时,会调用一些setter方法。为什么?Hibernate必须读取所有属性,但为什么要将值(而不是ID)设置回实体

代码 输出 弹簧配置 实体映射 图书馆版本
  • java 1.6.0_29
  • Hibernate3.6.0
  • 弹簧3.0.5

在Hibernate源代码中可以很容易地找到这个stacktrace答案


为了保存对象,Hibernate从中提取状态。在“按自定义保存”过程中,可以更改提取的状态,或为“版本”字段赋值。如果状态已更改,Hibernate会将其写回对象(所有字段,它不会跟踪哪些字段已更改),这就是您观察到的情况。

能否显示此调用的stacktrace(即
new Throwable().printStackTrace()
)?第二个setAmountMonth的stacktrace:stacktrace添加到我的问题Yes。我下载了hibernate源代码并调试了我的代码。我的契约更复杂——它包含一些对象集合。Hibernate必须将其实现(org.Hibernate.collection.PersistentBag)设置为跟踪集合中的更改。这是错误的,它设置了所有属性,而不仅仅是集合。
public void run(){
    System.out.println("Before transaction");
    loadInitialData();
    System.out.println("After transaction");
}

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Throwable.class)
private void loadInitialData() {
    Contract contract = new Contract();
    contract.setAmountMonth(new BigInteger("42"));
    System.out.println("Before persist");
    entityManager.persist(contract);
    System.out.println("After persist");
}
Before transaction
Contract.setAmountMonth null -> 42              ---- OK, my call
Before persist
Contract.getAmountMonth 42 -> 42
Contract.setAmountMonth 42 -> 42                !!!!!! WHY?
After persist
Contract.getAmountMonth 42 -> 42
Contract.getAmountMonth 42 -> 42
Contract.getAmountMonth 42 -> 42
After transaction
   <persistence-unit name="org.drools.persistence.jpa.local">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>jdbc/dataSource</non-jta-data-source>
        <mapping-file>META-INF/orm.xml</mapping-file>
        <class>org.drools.persistence.info.SessionInfo</class>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.transaction.flush_before_completion" value="true" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
        </properties>
    </persistence-unit>
public class Contract  {
    private volatile long ceresID;
    private volatile BigInteger amountMonth;

    public long getCeresID() {
        return ceresID;
    }
    public void setCeresID(long ceresContractID) {
        this.ceresID = ceresContractID;
    }

    public BigInteger getAmountMonth() {
        System.out.println("Contract.getAmountMonth " + this.amountMonth + " -> " + amountMonth);
        return amountMonth;
    }
    public void setAmountMonth(BigInteger amountMonth) {
        System.out.println("Contract.setAmountMonth " + this.amountMonth + " -> " + amountMonth);
        this.amountMonth = amountMonth;
    }
}
<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">
    <entity class=".....Contract" access="PROPERTY">
        <attributes>
            <id name="ceresID" access="FIELD">
                <generated-value strategy="AUTO"/>
            </id>
        </attributes>
    </entity>
</entity-mappings>
at Contract.setAmountMonth(Contract.java:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:583)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:229)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3822)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:299)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at $Proxy29.persist(Unknown Source)
at DBPersister.persistOrMerge(DBPersister.java:93)