Not-null property references a null or transient value für Wert beibehalten

Ich versuche, bestehen zwei unterschiedliche Entitäten mit JPA1, mit der Hibernate-Implementierung.
Der code für diese ist, wie gezeigt, unten:

Übergeordneten entity-Klasse

@Entity
@Table(name = "parent")
public class Parent implements Serializable {

    {...}
    private Child child;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "child_id", nullable = "false")
    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
}

Kind entity-Klasse

@Entity
@Table(name = "child")
public class Child implements Serializable {

    private Integer id;

    @Id
    @Column(name = "child_id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

Testfall

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/application.xml")
@Transactional
public class ParentTest extends TestCase {

    @PersistenceContext
    private EntityManager entityManager;

    @Test
    public void testSave() {
        Child child = new Child();
        child.setId(1);

        Parent parent = new Parent();
        parent.setChild(child);

        entityManager.persist(parent.getChild());
        entityManager.persist(parent); //throws the exception
    }
}

Entity-manager und Transaktion auf application.xml

<tx:annotation-driven transaction-manager="transactionManager" /> 

<jee:jndi-lookup id="dataSource" jndi-name="java:/jdbc/myds" expected-type="javax.sql.DataSource" /> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="com.mypackage" />
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter" 
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</prop>
        </props>
    </property>
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean>

Wenn Sie versuchen, fügen Sie das übergeordnete Objekt, hibernate wirft einen PropertyValueException, sagen Kind ist null oder Transienten, obwohl Kind wurde erzeugt und persistiert werden, bevor diese operation. Das seltsame ist, das schlägt nur auf die unit-Tests, und in der realen Anwendung, mit einer pre-eingefügt Kind, dies funktioniert genau wie erwartet.

PS:
Ich bin mir ziemlich bewusst, ich könnte Karte Kind mit Kaskade bestehen, aber das ist nicht die Idee hier. Ich will einfach nur, um zu überprüfen, ob diese beiden unabhängig voneinander arbeiten.

  • Welche Art ist EntityManager? Ich kann nicht finden jede Bezugnahme auf insert() Methode.
  • Ich denke, es könnte sein, in Bezug auf die Handhabung der Transaktionen in der Junit-Methode. Die Eltern können nur dann eingesetzt werden, wenn das Kind bereits in der Datenbank (nach commit). Das würde erklären, warum es funktioniert, auf Ihrem "echten" Anwendung hier nicht. Können Sie teilen Ihre application.xml Datei?
  • mein schlechtes. Ich bin mit der persist-Methode. Fixiert auf die post.
  • Hinzugefügt wurde die Transaktion und entity manager-config aus application.xml
  • Können Sie uns zeigen, der stack-trace?
InformationsquelleAutor renke | 2014-11-24
Schreibe einen Kommentar