2009-08-18 31 views
1

我有一個簡單的領域類許可:休眠聯接表重複項 - 無法執行JDBC批處理更新

@Entity 
@Table(name = "LICENSEE") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Licensee implements Serializable, Comparable { 
    private Integer id; 
    private String orgName; 

    /* ... */ 

    private Set<Address> address = new HashSet<Address>(); 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(generator = "increment") 
    @GenericGenerator(name = "increment", strategy = "org.hibernate.id.IncrementGenerator") 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name = "ORGNAME") 
    public String getOrgName() { 
     return orgName; 
    } 

    public void setOrgName(String orgName) { 
     this.orgName = orgName; 
    } 

    /* ... */ 

    @OneToMany 
    @Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
    @JoinTable(name = "LICENSEEADDRESS", 
     joinColumns = { 
      @JoinColumn(name = "LICENSEEID", unique = true) 
     }, 
     inverseJoinColumns = { 
      @JoinColumn(name = "ADDRESSID") 
     } 
    ) 
    public Set<Address> getAddress() { 
     return address; 
    } 

    public void setAddress(Set<Address> address) { 
     this.address = address; 
    } 

    public void addAddress(Address address) { 
     this.address.add(address); 
    } 
} 

持有的設置地址對象的引用。我使用@JoinTable註釋來處理兩個類之間的數據庫關係。我將hibernate.hbm2ddl設置爲創建,它使用組合鍵LICENSEEID和ADDRESSID創建連接表LICENSEEADDRESS,如預期的那樣。然而,當我在一個時間打電話saveOrUpdate在設置多個地址對象被許可對象上,我得到這個:

java.sql.BatchUpdateException: Duplicate entry '1' for key 2 
com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:647) 
org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297) 
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:171) 
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701) 
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321) 
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
$Proxy18.saveLicensee(Unknown Source) 
net.grouplink.gilf.web.controllers.LicenseeFormController.onSubmit(LicenseeFormController.java:64) 
org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267) 
org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:265) 
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) 
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 

所以在該批次第二個查詢未完成,因爲它認爲有一個重複鍵,對於那一列是真的。但是對於一個組合鍵,這兩個ID是不是必須相同才能導致違反約束?我在這裏錯過了什麼?

回答

0

拿出「獨特=真」,它的工作。

0

This概述瞭如何使用任意JPA提供程序設置組合密鑰。

+0

感謝您的回答。你的回答讓我更仔細看看我的註釋。不知怎的,我讓獨特=真正的滑倒在那裏,這是造成它。感謝您的鏈接。 – UrLicht 2009-08-18 20:35:34

相關問題