我正在我的应用程序中实现JPA。 此应用程序已使用Spring,Hibernate SessionFactories(3),带有XA数据源的Wild Fly服务器和JTA事务管理器。
为了测试JPA,我将它设置在一个简单的Entity上,该Entity没有与任何其他Entity链接。
选择和HQL查询没问题,但没有保存。 我的问题是当我创建或更新这个实体时,创建和修改都没有效果且没有错误。
我想知道TransactionManager方面是否存在问题。 我不拥有 persistence.xml 文件
服务:
@Service
@Transactional(value = "transactionManager")
public class UtilisateurServiceImpl implements UtilisateurService {
@Autowired
private UtilisateurDao utilisateurDAO;
public UtilisateurServiceImpl() {
}
...
public void creerUser() {
utilisateurDAO.creerUser();
}
}
道:
@Repository
public class UtilisateurDaoImpl implements UtilisateurDao {
@PersistenceContext(unitName="habilitationPersistenceUnit") private EntityManager entityManager;
public UtilisateurDaoImpl() {
}
...
public void creerUser() {
UtilisateurEntity utilisateur2 = new UtilisateurEntity();
utilisateur2.setDateCreation(new Date());
utilisateur2.setFax("");
utilisateur2.setIdentifiant("Olivier");
utilisateur2.setPassword("password");
utilisateur2.setMail("");
utilisateur2.setNom("Potonnier");
utilisateur2.setNomAffichage("Olivier Potonnier");
utilisateur2.setPrenom("Olivier");
utilisateur2.setTelephone("");
utilisateur2.setDateMAJ(new Date());
//utilisateur2.setPk(40);
try {
entityManager.persist(utilisateur2);
entityManager.flush();
} catch(Exception e) {
e.printStackTrace();
}
// try {
// UtilisateurEntity entity = entityManager.find(UtilisateurEntity.class, 1);
// entity.setPassword("password");
// entityManager.merge(entity);
// } catch(Exception e) {
// e.printStackTrace();
// }
}
实体:
@Entity @Table(name="UTILISATEUR")
public class UtilisateurEntity implements Serializable {
private static final long serialVersionUID = -3416450676331189345L;
@Id @GenericGenerator(name="entityIdGenerator", strategy="com.prima.solutions.primaclaims.core.dao.impl.PkGenerator",
parameters={@Parameter(name=PkGenerator.TABLE, value="SEQUENCE"),
@Parameter(name=PkGenerator.PK_COLUMN_NAME, value="ENTITE"),
@Parameter(name=PkGenerator.PK_COLUMN_VALUE, value="UTILISATEUR"),
@Parameter(name=PkGenerator.VALUE_COLUMN_NAME, value="NUMERO")
})
@GeneratedValue(generator="entityIdGenerator")
private Integer pk;
@Column(name="NOM") private String nom;
@Column(name="PRENOM") private String prenom;
@Column(name="IDENTIFIANT") private String identifiant;
@Column(name="PASSWORD") private String password;
@Column(name="NOM_AFFICHAGE") private String nomAffichage;
@Column(name="TELEPHONE") private String telephone;
@Column(name="FAX") private String fax;
@Column(name="MAIL") private String mail;
@Column(name="DATE_CREATION") private Date dateCreation;
@Column(name="DATE_MISE_A_JOUR") private Date dateMAJ;
public Integer getPk() {
return pk;
}
public void setPk(Integer pk) {
this.pk = pk;
}
....
}
数据源配置
<!-- Data sources des differents schema -->
<bean id="dataSourceReferentiel" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
<property name="jndiName" value="java:/DS_Referentiel" />
<property name="resourceRef" value="true" />
</bean>
<bean id="dataSourceHabilitation" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
<property name="jndiName" value="java:/DS_Habilitation" />
<property name="resourceRef" value="true" />
</bean>
<bean id="dataSourceSinistre" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
<property name="jndiName" value="java:/DS_Sinistre" />
<property name="resourceRef" value="true" />
</bean>
<!-- Transaction manager -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
实体经理配置
<bean id="referentielEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="referentielPersistenceUnit" />
<property name="dataSource" ref="dataSourceReferentiel" />
<property name="packagesToScan" value="com...entity.referentiel" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- Privilégier les logs debug de org.hibernate.SQL -->
<property name="showSql" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
</bean>
</property>
</bean>
<bean id="habilitationEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="habilitationPersistenceUnit" />
<property name="dataSource" ref="dataSourceHabilitation" />
<property name="packagesToScan" value="com...entity.habilitation" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- Privilégier les logs debug de org.hibernate.SQL -->
<property name="showSql" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
</bean>
</property>
</bean>
<bean id="sinistreEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="sinistrePersistenceUnit" />
<property name="dataSource" ref="dataSourceSinistre" />
<property name="packagesToScan" value="com...entity.sinistre" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- Privilégier les logs debug de org.hibernate.SQL -->
<property name="showSql" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
</bean>
</property>
</bean>
答案 0 :(得分:0)
似乎我必须定义persitence.xml,定义实体和事务查找。有了这个(下面)就可以了。
<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="referentielPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
</properties>
</persistence-unit>
<persistence-unit name="habilitationPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.prima.solutions.primaclaims.core.entity.habilitation.UtilisateurEntity</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
</properties>
</persistence-unit>
<persistence-unit name="sinistrePersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
</properties>
</persistence-unit>
</persistence>
答案 1 :(得分:0)
我只想在这个主题上添加最后一件事。 因为我正在使用带有XA数据源的JTA事务,所以我必须声明一个peristence.xml文件并在JTA查找中设置并声明所有内容。
JTA带来了很多限制,但如果你需要它,你可以在这里找到一个样本。 在大多数情况下,不喜欢使用JTA,声明&amp;设置会更简单。