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 aufinsert()
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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem hier ist, Sie beharren der übergeordneten Tabelle mit den eingestellten Werten .
Wenn es geht, um zu bestehen, braucht es die Kind-Tabelle id, die gespeichert werden schon, wie es war ein foreign key und somit war es ein nicht-null property references a null-Wert.
Versuchen Sie, diese um das Kind zu retten, und dann erste Elternteil .Sonst ändern die Zuordnung
Erste Sache, die Sie mittels @ManyToOne in Eltern, die mir sagt, dass Sie mehr als ein Elternteil für ein Kind-Objekt, ich denke, das ist nicht der Fall.
Gemäß Ihrer Klasse Struktur, die ich verstehen kann, dass Sie OneToOne mapping zwischen Eltern-und Kind-Entitäten.
Betreffend die Ausnahme ist, gibt es einen Grund Sie nicht mit Kaskaden zwischen Eltern und Kind zu behandeln, das mapping automatisch für das speichern, aktualisieren und löschen ? Wenn Sie haben nicht darüber nachgedacht, als Sie geben können, es zu versuchen, die Einstellung unter Konfiguration wie hier angegeben : Beispiel Eltern/Kind - Hibernate
Obwohl, würde ich vorschlagen, ändern die Zuordnung von ManyToOne zu OneToOne zwischen Kind und Eltern.
Bitte lassen Sie mich wissen.
Abgesehen davon, dass er ein Elternteil mit einem FK zu einem Untergeordneten Problem, die bestehen, um den Ursachen für Ihr Problem.
Dein problem ist bezogen auf die Spülung. Nur weil Sie angewiesen Hibernate zu persistieren eines Objekts, es bedeutet nicht, es dient automatisch Ihre Anfrage. Das fortbestehen Antrag geht auf eine Aktion, die Warteschlange nur materialisiert, die beim flush. Damit Ihre zweite fortbestehen einfach zu finden im Übergeordneten Entität ohne eine tatsächliche "permanenten" Kind.
Können Sie einfach lösen Sie Ihren code wie folgt:
Versuchen Sie dies:
Einige Feld wird festgelegt, mit
not-null="true"
Sie haben einen Wert bieten, für, dass, bevor saveing zu db.Für alle Felder in der Eltern-Tabelle und Kind-Tabelle gesetzt, alle not null-Felder mit den entsprechenden Wert
Versuchen Sie geben
@ManyToOne(fetch = FetchType.LAZY,cascade=PERSIST, mappedBy="parent")
fürpublic Child getChild()
und bleiben bestehen, nur das parent-Objekt.Beide beibehalten.