hibernate - 如何为连接表自动生成 GUID?

标签 hibernate jpa uuid auto-generate

我使用的是 Hibernate 4.1.0.Final、JPA 2.0 和 MySQL 5.5。我有以下实体:

@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”。它的主键是一个 varchar(32) 非空字段,我希望它是一个 GUID,类似于组织实体的 ID。如何为此表自动生成 ID?当我尝试用地址保存一个组织时,我得到了异常(exception)......
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)

最佳答案

您不应为连接表自动生成 ID。相反,您应该从 cb_organization_address 中删除 ID 列。 .

联接表通常没有自己的 ID,它们仅表示两件事之间的关联。因此,关系本身的“身份”通常是相关的两个事物的复合键。对于您的用例,我会说这是正确的数据模型:每个组织可以有任何地址零次或一次,每个地址可以在任意数量的组织中。

关于hibernate - 如何为连接表自动生成 GUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13401559/

相关文章:

java - hibernate中查询语法异常

java - Spring In CorrectResultSizeDataAccessException 查询返回 Long 值? java

java - 多态查询和笛卡尔积

mongodb - 本地 UUID 与网络唯一计数器 ID

java - Criteria API 中有类似 Restrictions.eq(true, false) 的东西吗?

java - 监听MySQL数据库的变化并自动更新前端,无需显式刷新前端

java - Kotlin:集合既没有泛型类型也没有 OneToMany.targetEntity()

java - Lockmodetype.Pessimistic_Read 正在锁定除锁定行之外的行

oracle - 如何在Oracle上生成版本4(随机)的UUID?

angular - 将 Angular 9 更新为 9.1,出现错误 "This expression is not callable"