2014-05-20 13 views
7

Ich bekomme eine NOT NULL Constraint-Verletzung Ausnahme beim Versuch, ein Objekt vom Typ Individual in der DB einzufügen. Ich benutze hsql Version 2.3.2. Ich lasse Hibernate die DB-Tabellen für mich generieren. Im normalen Code (wo ich eine SQLServer-Datenbank verwende) funktioniert alles gut.ConstraintViolationException: NOT NULL bei Verwendung von Spring, HSQL und Hibernate

Dies ist mein individuelles Objekt, wo die ID von der Datenbank generiert wird und der Primärschlüssel der Tabelle ist.

Einzelobjekt:

@XmlRootElement 
@Entity 
@Table(name="INDIVIDUALS") 
public class Individual { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="INDIVIDUAL_ID") 
    private long id; 

Im HealthCareProfessional Objekt gibt es einen Link zu dem Primärschlüssel dieses Einzelobjekt:

@Entity 
@Table(name="HEALTHCARE_PROFESSIONALS") 
public class HealthCareProfessional { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="HEALTHCARE_PROFESSIONAL_ID") 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "INDIVIDUAL_ID", nullable = false, updatable = false, insertable = true) 
    private Individual individual; 

    ... 

Der Anwendungskontext, wo ich definieren die EntityManagerFactory wie folgt aussieht:

<jdbc:embedded-database id="dataSource" type="HSQL" /> 

<bean id="emf" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="/persistence-unittest.xml" /> 
    <property name="persistenceUnitName" value="testingSetup"/> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <!-- Create the database, please --> 
      <property name="generateDdl" value="true" /> 
     </bean> 
    </property> 
</bean> 

<bean id="jpaVendorAdaptor" 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 

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

Meine Persistenz Xml ist definitiv ed wie folgt:

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
     version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 

    <persistence-unit name="testingSetup"> 
     <!-- The autodetection only works if the classes are packaged as a JAR. Doesn't work for unit tests. Go figure --> 
     <class>be.healthconnect.pwg.domain.individual.HealthCareProfessional</class> 
     <class>be.healthconnect.pwg.domain.individual.Individual</class> 

     <properties> 
      <property name="hibernate.archive.autodetection" value="" /> 
      <property name="hibernate.show_sql" value="true"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Das ist mein Unit-Test:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(value = {"classpath:/applicationContext-test.xml"}) 
@Transactional 
public class IndividualDaoTest { 

    private static final String SSIN_JELLE= "81062205558"; 
    private static final String NIHII = "123"; 

    @Autowired 
    private IIndividualDao individualDao; 

    @Before 
    public void setUp() throws Exception { 
     Individual individual = buildIndividual(SSIN_JELLE); 
     individualDao.addIndividual(individual); 
    } 

    @Test 
    public void testGetIndividualsBySSIN() throws Exception { 

     final List<Individual> individuals = individualDao.getIndividuals(SSIN_JELLE); 
     Assert.assertNotNull(individuals); 
     Assert.assertEquals(1, individuals.size()); 
     Individual individual = individuals.get(0); 
     Assert.assertNotNull(individual); 
    } 

Und das ist die Fehlermeldung, die ich bekam:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10143 table: HEALTHCARE_PROFESSIONALS column: INDIVIDUAL_ID 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1294) 
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:860) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241) 
at com.sun.proxy.$Proxy34.persist(Unknown Source) 
at be.healthconnect.pwg.data_access.dao.impl.IndividualDao.addIndividual(IndividualDao.java:84) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198) 
at com.sun.proxy.$Proxy36.addIndividual(Unknown Source) 
at be.healthconnect.pwg.data_access.dao.impl.IndividualDaoTest.setUp(IndividualDaoTest.java:44) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

Ich verstehe nicht, warum wirklich hsql doesn‘ t verwenden Sie die generierten Werte für die ID ...

Antwort

9

Entfernen Sie die nullable = false auf der Leitung @JoinColumn(name = "INDIVIDUAL_ID", nullable = false, updatable = false, insertable = true). Da zu dem Zeitpunkt, zu dem der Ruhezustand die Verbindung herstellt, die ID ManyToOne noch nicht eingerichtet ist, verursacht dies Ihren Fehler. Wenn Sie extra Schutz vor null Werten wollen, dann verwenden Sie @NotNull außerhalb der @JoinColumn. Die nullable = false innerhalb der @JoinColumn erstellt die Einschränkung für die Datenbank, während @NotNull es auf der Objektschicht behält.

Verwandte Themen