2012-08-22 33 views
0

我有一個獨特的約束我的實體的一個屬性的實體:沒有持久性的異常持續時()被調用,違反唯一約束

Table(uniqueConstraints = @UniqueConstraint(name = "UniqueByEmail", columnNames = "email")) 
public class Player implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @Column(name = "email") 
    private String email; 
    ... 
} 

在吾道我想拋出時,合適的異常東西試圖創造一個新的球員,將違反這個約束:

public Player create(String email, String password) { 
    Player player = new Player(email, password); 
    try { 
     em.persist(player); 
    } catch (Exception e) { 
     System.err.println("I GOT AN EXCEPTION : " + e.getClass()); 
    } 
    return player; 
} 

不幸的是沒有任何反應。當我在實體管理器上調用flush()時,我得到持久性異常作爲此調用的結果,但不是當我調用persist()時。

這種行爲不同於休眠的行爲,所以我認爲我錯誤地配置了某些東西。

任何幫助,非常感謝。

的persistence.xml: org.eclipse.persistence.jpa.PersistenceProvider model.GameInstanceAccount 球員

春天的applicationContext.xml:

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="persistence-unit" /> 
    <property name="jpaDialect" ref="jpaDialect" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter" /> 
    </property> 
</bean> 

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" /> 

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
    <property name="generateDdl" value="true" /> 
    <property name="databasePlatform" value="org.eclipse.persistence.platform.database.HSQLPlatform" /> 
</bean> 

回答

1

當我在實體管理器調用flush()我得到的持久性 例外,因爲這個調用的結果,但不是我的呼喚堅持()

這是正常現象。持久性調用僅將瞬態實體附加到當前的持久性會話,使其進行管理。約束適用於數據庫,因此僅在刷新持久性會話並將新實體插入數據庫時​​應用。

實體類的一個新創建的實例傳遞給堅持 方法:

這將在本blog如下總結。在此方法返回後,該實體將被管理並計劃到 以插入到數據庫中。它可能發生在 事務提交時或調用flush方法之前。

+0

這可能是,但休眠例如觸發器插入查詢時persist被調用,並拋出持久的異常,當出現錯誤。我想要並需要這種行爲。是否有可能從eclipselink獲得它? – Laures

+1

「hibernate例如觸發器在調用persist時插入查詢」 - 這不一定是真的。這取決於用於生成標識符的策略。 –

相關問題