我有一個簡單的領域類許可:休眠聯接表重複項 - 無法執行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是不是必須相同才能導致違反約束?我在這裏錯過了什麼?
感謝您的回答。你的回答讓我更仔細看看我的註釋。不知怎的,我讓獨特=真正的滑倒在那裏,這是造成它。感謝您的鏈接。 – UrLicht 2009-08-18 20:35:34