2016-05-18 13 views
0

Ich habe die Hierarchie folgende Einheit:OpenJPA Parent Child Kaskade Einsatz Ausgabe

Eltern

@Entity 
@Table(name = "CNTC_RLTNSHP") 
public class ContactRelationship implements Serializable { // Parent 
private static final long serialVersionUID = 1L; 

@Id 
@Column(name = "O_CNTC_RLTNSHP_ID", updatable = false) 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer contactRelationshipID; 

@Column(name = "O_WRK_ID") 
private Long odsID; 

@OneToMany(mappedBy = "phoneContactRelationship", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, targetEntity = ContactRelationshipPhone.class) 
private List<ContactRelationshipPhone> contactRelationshipPhones; 

// ... 

Kind

@Entity 
@Table(name = "CNTC_RLTNSHP_PH") 
public class ContactRelationshipPhone implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private ContactRelationshipPhonePK id; 

@Column(name = "CNTC_PH_NMBR_TXT") 
private String contactPhoneNumber; 

@Column(name = "PRMY_PH_INDCTR") 
private String contactPrimaryPhoneIndicator; 

@MapsId("contactRelationshipID") 
@ManyToOne 
@JoinColumn(name = "O_CNTC_RLTNSHP_ID", referencedColumnName = "O_CNTC_RLTNSHP_ID", insertable = false, updatable = false) 
private ContactRelationship phoneContactRelationship; 

public ContactRelationshipPhone() { 
} 

// ... 

Kind PK

@Embeddable 
public class ContactRelationshipPhonePK implements Serializable { 
private static final long serialVersionUID = 1L; 

@Column(name = "O_CNTC_RLTNSHP_ID") 
private Integer contactRelationshipID; 

@Column(name = "PH_TYP_CD") 
private String phoneCode; 

@Column(name = "PH_TYP_TXT") 
private String phoneText; 

public ContactRelationshipPhonePK() { 
} 

// ... 

Der generierte Primärschlüssel ist nicht in untergeordneten Klassen festgelegt, daher erhalte ich beim Einfügen von Daten in untergeordneten Tabellen eine SQL-Ausnahme.

Exception

Exception in thread "main" <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal store error> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. 
FailedObject: [email protected]b061b0 
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:594) 
    at com.test.Test.main(Test.java:73) 
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal general error> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. 
FailedObject: [email protected]b061b0 
    at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2352) 
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2189) 
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2087) 
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2005) 
    at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) 
    at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1529) 
    at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933) 
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570) 
    ... 1 more 
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal general error> org.apache.openjpa.persistence.PersistenceException: AN UPDATE, INSERT, OR SET VALUE IS NULL, BUT THE OBJECT COLUMN O_CNTC_RLTNSHP_ID CANNOT CONTAIN NULL VALUES {prepstmnt 1218201756 INSERT INTO XXX.CNTC_RLTNSHP_PH (PH_TYP_CD, PH_TYP_TXT, CNTC_PH_NMBR_TXT, PRMY_PH_INDCTR) VALUES (?, ?, ?, ?) [params=(null) null, (null) null, (String) E, (String) E]} [code=-407, state=23502]SQLCA OUTPUT[Errp=DSNXODM , Errd=12, 0, 0, -1, 0, 0] 
AN UPDATE, INSERT, OR SET VALUE IS NULL, BUT THE OBJECT COLUMN O_CNTC_RLTNSHP_ID CANNOT CONTAIN NULL VALUES 
THE DESCRIBE STATEMENT DOES NOT SPECIFY A PREPARED STATEMENT 
THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT 
FailedObject: [email protected]b061b0 
    at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4991) 
    at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4957) 
    at org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException(DB2Dictionary.java:571) 
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136) 
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78) 
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:144) 
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:79) 
    at com.ibm.ws.persistence.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:63) 
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:100) 
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:88) 
    at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:550) 
    at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:106) 
    at org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59) 
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:113) 
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:78) 
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:732) 
    at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131) 
    ... 8 more 
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: AN UPDATE, INSERT, OR SET VALUE IS NULL, BUT THE OBJECT COLUMN O_CNTC_RLTNSHP_ID CANNOT CONTAIN NULL VALUES {prepstmnt 1218201756 INSERT INTO XXXX.CNTC_RLTNSHP_PH (PH_TYP_CD, PH_TYP_TXT, CNTC_PH_NMBR_TXT, PRMY_PH_INDCTR) VALUES (?, ?, ?, ?) [params=(null) null, (null) null, (String) E, (String) E]} [code=-407, state=23502] 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219) 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:195) 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$1000(LoggingConnectionDecorator.java:59) 
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1134) 
    at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:275) 
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1792) 
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:268) 
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:119) 
    ... 19 more 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/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"> 

    <persistence-unit name="jpa-test" transaction-type="RESOURCE_LOCAL"> 
     <class>com.principal.scbu.ods.entity.worker.ContactRelationship</class> 
     <class>com.principal.scbu.ods.entity.worker.ContactRelationshipPhone</class> 
     <class>com.principal.scbu.ods.entity.worker.ContactRelationshipPhonePK</class> 

     <properties> 
      <property name="openjpa.ConnectionDriverName" value="com.ibm.db2.jcc.DB2Driver" /> 
      <property name="openjpa.ConnectionURL" 
       value="jdbc:db2://host:port/dbname:retrieveMessagesFromServerOnGetMessage=true;" /> 
      <property name="openjpa.ConnectionUserName" value="*****" /> 
      <property name="openjpa.ConnectionPassword" value="*******" />    
      <property name="openjpa.jdbc.Schema" value="XXX" /> 
      <property name="openjpa.jdbc.DBDictionary" value="db2" /> 
      <property name="openjpa.TransactionMode" value="local" /> 
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 
      <property name="openjpa.Compatibility" 
       value="StrictIdentityValues=false,QuotedNumbersInQueries=true" /> 
      <property name="openjpa.RuntimeUnenhancedClasses" value="0" /> 
      <property name="openjpa.Log" 
       value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE" /> 
      <property name="openjpa.jdbc.MappingDefaults" 
       value="jpa(ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict)" /> 
      <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)" /> 
      <property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Was bin ich?

Antwort

0

Die entsprechende Spalte erscheint nicht einmal in der Insert-Anweisung:

INSERT INTO XXX.CNTC_RLTNSHP_PH 
     (PH_TYP_CD, PH_TYP_TXT, CNTC_PH_NMBR_TXT, PRMY_PH_INDCTR) 

, die vielleicht nicht überraschend ist, können Sie es als insertable=false, updateable = false markiert gegeben haben.

@MapsId("contactRelationshipID") 
@ManyToOne 
@JoinColumn(name = "O_CNTC_RLTNSHP_ID", referencedColumnName = "O_CNTC_RLTNSHP_ID", insertable = false, updatable = false) 
private ContactRelationship phoneContactRelationship; 

Versuchen Sie, diese Attribute zu entfernen.

Geben Sie Ihr Update, das verbleibende Problem ist, dass Sie wahrscheinlich nicht beide Seiten der Beziehung festlegen, die Sie immer tun müssen.

ContactRelationship cr = new ContactRelationship (); 
ContactRelationshipPhone crp = new ContactRelationshipPhone(); 
cr.getContactRelationshipPhones.add(crp); 
crp.setPhoneContactRelationship(cr); 
+0

ich es immer noch versucht, zu entfernen gleichen Fehler Aussage haben jetzt eine UPDATE, INSERT geändert einfügen .Der ODER eingestellte Wert ist NULL, aber das Column-Objekt * N enthalten, können nicht NULL-Werte {prepstmnt 1706321332 INSERT INTO XXX.CNTC_RLTNSHP_PH (O_CNTC_RLTNSHP_ID, PH_TYP_CD, PH_TYP_TXT, CNTC_PH_NMBR_TXT, PRMY_PH_INDCTR) WERTE (?,?,?,?,?) [Params = (null) null, (null) null, (null) null, (String) E, (String) E]} code = -407, state = 23502] SQLCA OUTPUT [Fehler = DSNXRIHD, Errd = -136, 0, 0, -1, 0, 0] – Rohit

+0

Ihre persitence.xml ist für die Frage nicht relevant. Entfernen Sie das und geben Sie den Code ein, in dem Sie die Entität erstellen und speichern. –

+0

Siehe aktualisierte Antwort. –

0

Alan Hay bietet gute Punkte, aber ich würde nicht zustimmen, dass die Datei persistence.xml nicht relevant ist. Alan mag recht haben, aber es ist interessant, die Einstellungen zu sehen. In der Datei p.xml ist viel los. Eine Sache, die ich nicht mag, ist die Verwendung von "openjpa.RuntimeUnenhancedClasses". Dies sollte entfernt werden, siehe die Kommentare "Diese Funktion ist oft nützlich für Rapid Prototyping, wird aber nicht generell für die Produktion empfohlen." in dieser doc:

http://openjpa.apache.org/builds/2.2.2/apache-openjpa/docs/manual#openjpa.RuntimeUnenhancedClasses

Es könnte auch interessant sein zu sehen, ob die openjpa.Compatibility und openjpa.jdbc.MappingDefaults Einstellungen einen Unterschied machen. Letztendlich, wie Alan feststellte, wäre Ihr Code zum Erstellen/Fortbestehen der Entität von Wert, um hier zu sehen.

+0

Es funktionierte für mich nach der Einstellung Elternteil in Kind i.Setzen Sie ContactRelationship in ContactRelationshipPhone. Danke Alan und Heath – Rohit

Verwandte Themen