em.persist(object)-Problem

schnuffie

Erfahrenes Mitglied
Hallo Experten,

ich verwende Hibernate 3 um meine Daten persistent zu machen.
App-Server: JBoss 4.2
DB: mySQL

Das Speichern des 1. Objects (also der 1. em.persist(object)-Aufruf) funktioniert stets wunderbar:
HTML:
10:48:09,067 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0) vorher
10:48:09,067 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0)=false
10:48:09,067 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0)=2035663557
10:48:09,067 INFO [STDOUT] Hibernate: insert into SHS_CUSTOMER (Company_Name, Surname, Forename, Street, House_Number, Zip_Code, City, Telephone, Email_Address, Additional_Info, Customer_Flag, Supplier_Flag) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
10:48:09,098 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(19) inserted

Will ich jetzt ein anderes Object speichern (also der 2. em.persist(object)-Aufruf) funktioniert es nicht mehr:
HTML:
10:48:32,286 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0) vorher
10:48:32,286 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0)=false
10:48:32,286 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0)=1446571370
10:48:32,286 INFO [HibernatePersistenceCustomerImpl] PersistenceCustomer(0) inserted
Es wurde nichts eingefügt. Um etwas zu persistieren, muß die automatisch zu vergebende ID 0 sein, wie beim 1. Speichern (siehe oben).

Mein Code-Abschnitt:
Code:
public T insertObject(T object) {
if (object == null) {
returnnull;
}
log.info(object + " vorher");
try {
log.info(object + "=" + em.contains(object));
log.info(object + "=" + object.hashCode());
em.persist(object);
} catch(Exception e) {
log.info(e.getMessage());
}
log.info(object + " inserted");
return object;
}
Der Typ T ist in der abgeleiteten Klasse PersistenceCustomer.

Die Einträge der Config-Dateien:
HTML:
<?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_1_0.xsd"
version="1.0">
<persistence-unit name="storehouse" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
 
<jta-data-source>java:/StorehouseDS</jta-data-source>
 
<properties>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.autocommit" value="false" />
 
<property name="c3p0.acquire_increment" value="1" />
<property name="c3p0.idle_test_period" value="100" />
<property name="c3p0.initialPoolSize" value="10" />
<property name="c3p0.min_size" value="15" />
<property name="c3p0.max_size" value="50" />
<property name="c3p0.timeout" value="1800" />
 
</properties>
</persistence-unit>
</persistence>
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<!-- Transactions (<local-tx-datasource>) sind bei NICHT-änderbarem Autocommit nicht zugelassen: 
"java.sql.SQLException: You cannot set autocommit during a managed transaction!" -->
<!-- Aus diesem Grund erfolgte die Umstellung auf transaktionslos: (<no-tx-datasource>) -->
<no-tx-datasource>
<jndi-name>StorehouseDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/strenggeheim</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>strenggeheim</user-name>
<password>strenggeheim</password>
<min-pool-size>2</min-pool-size>
<max-pool-size>8</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>
<connection-property name="char.encoding">UTF-8</connection-property>
<application-managed-security />
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
<new-connection-sql>SELECT COUNT(*) FROM MYSQL.USER</new-connection-sql>
<check-valid-connection-sql>SELECT COUNT(*) FROM MYSQL.USER</check-valid-connection-sql>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</no-tx-datasource>
</datasources>

Aufgrund des (bekannten) Autocommit-Problems bei "<local-tx-datasource>" (Autocommit ist nicht abschaltbar) mußte ich hier auf Transaktionen verzichten.
Mit em.flush() nach em.persist(object) habe ich immernoch das gleiche Problem.

Wo liegt mein Fehler?
 
Zwei Fragen:

Kann es sein, dass du versuchst, das gleiche Objekt zu persistieren? Die Logausgaben PersistenceCustomer(0) machen mich etwas stutzig. Was ist "PersistenceCustomerImpl"? Eine DAO Implementierung oder Das zu speichernde Domänenobjekt.

Ich glaube, mich erinnern zu können, dass für ungespeicherte Entities die Id NULL sein muss, nicht 0, vielleicht hängts damit zusammen?

Gruß
Ollie
 
Ich glaube, mich erinnern zu können, dass für ungespeicherte Entities die Id NULL sein muss, nicht 0, vielleicht hängts damit zusammen?
0 kommt daher, daß ich primitive Variablen verwendet habe, das ist auch ok so.

Kann es sein, dass du versuchst, das gleiche Objekt zu persistieren? Die Logausgaben PersistenceCustomer(0) machen mich etwas stutzig. Was ist "PersistenceCustomerImpl"? Eine DAO Implementierung oder Das zu speichernde Domänenobjekt.
In HibernatePersistenceCustomerImpl wird nur der Typ T und Typ ID durch PersistenceCustomer und Integer ersetzt. Das zu speichernde Objekt ist
PersistenceCustomer, das eine Entität (@Entity) ist:
Code:
@Entity
@Table(name = "SHS_CUSTOMER")
publicclass PersistenceCustomer {
 
@Id
@GeneratedValue
@Column(name = "Customer_Id", nullable = false)
privateintcustomerId;
 
@Column(name = "Company_Name")
private String companyName;
 
//...u.s.w.
 
public String toString() {
  return"PersistenceCustomer(" + this.customerId + ')';
}
Es handelt sich um jeweils ein neues Objekt. Die Erzeugung passiert so:
Code:
public T getObjectTemplate() throws PersistenceConfigException {
try {
  return (T) parameterizedClass.newInstance();
} catch (Exception e) {
  throw new PersistenceConfigException("Template-Entity konnte nicht erstellt werden.", e);
}
}
 
Zurück