2012-11-15 4 views
5

मैं हाइबरनेट 4.1.0 का उपयोग कर रहा हूं। फाइनल, जेपीए 2.0, और MySQL 5.5। मेरे पास निम्न इकाई है:मैं एक जॉइन टेबल के लिए GUID कैसे स्वतः उत्पन्न करूं?

@GenericGenerator(name = "uuid-strategy", strategy = "uuid.hex") 
@Entity 
@Table(name = "cb_organization", uniqueConstraints = {@UniqueConstraint(columnNames={"organization_id"})}) 
public class Organization implements Serializable 
{ 

    … 

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinTable(name = "cb_organization_address", 
       joinColumns = @JoinColumn(name = "organization_id"), 
       inverseJoinColumns = @JoinColumn(name = "address_id")) 
    /* List of addresses associated with this organization */ 
    private List<Address> addresses; 

जॉइन टेबल, "cb_organization_address" पर ध्यान दें। यह प्राथमिक कुंजी एक वर्चर (32) शून्य क्षेत्र नहीं है जिसे मैं संगठन इकाई की आईडी के समान एक GUID बनना चाहता हूं। मैं इस तालिका के लिए एक आईडी कैसे स्वतः उत्पन्न करूं? जब मैं कोशिश करते हैं और पते के साथ एक संगठन बचाने के लिए, मैं अपवाद ...

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Field 'ID' doesn't have a default value 
    org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1361) 
    org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289) 
    org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1295) 
    org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:976) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
    $Proxy47.flush(Unknown Source) 
    org.mainco.subco.organization.repo.OrganizationDaoImpl.save(OrganizationDaoImpl.java:63) 
    org.mainco.subco.organization.service.OrganizationServiceImpl.save(OrganizationServiceImpl.java:64) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    $Proxy62.save(Unknown Source) 
    org.mainco.subco.sbadmin.controllers.OrganizationController.save(OrganizationController.java:204) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
     org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
+0

सुनिश्चित करें कि आप एक समस्या को दूसरे से प्रतिस्थापित नहीं करते हैं: http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html – n8wrl

उत्तर

1

आपको एक तालिका में शामिल होने के लिए एक आईडी नहीं ऑटो उत्पन्न करनी चाहिए मिलता है। इसके बजाय, आपको आईडी कॉलम को cb_organization_address से हटा देना चाहिए।

टेबल में शामिल हों आम तौर पर अपनी आईडी नहीं होती है, वे केवल दो चीजों के बीच संघों का प्रतिनिधित्व करते हैं। इसलिए रिश्ते की 'पहचान' अक्सर दो चीजों से संबंधित की परिसर कुंजी होती है। आपके उपयोग के मामले में, मैं कहूंगा कि यह सही डेटा मॉडल है: प्रत्येक संगठन के पास शून्य या एक बार कोई पता हो सकता है, प्रत्येक पता किसी भी संगठन में हो सकता है।

संबंधित मुद्दे