oracle有个sys_guid值,如果想设置sys_guid为jpa的主键,应该怎样设置呢?

解决方案 »

  1.   

    JPA 中使用 sys_guid() 函数作为主键的话是做不到的。一般来说 UUID 作为主键的话,可以使用程序设计语言所生成的随机 UUID 值。具体方式参考 Vincent Partington 博客中 JPA implementation patterns: Using UUIDs as primary keys 这篇文章。
      

  2.   

    谢谢你的回答,如果真是一定要sys_guid()作主键的话,是不是要只能通过访问数据库获取呢?
      

  3.   

    那个几乎没办法做!是的,只能通过数据库获取,先使用 SELECT sys_guid() FROM dual; 的 native SQL 查出来。为什么一定要用 sys_guid() 呢?用 UUID 也是一样的,你是不是想到 UUID 当中有 4 个“-”啊?这个我们可以去掉的:import java.util.UUID;public class Test2 {
        
        private final static char[] HEX = "0123456789abcdef".toCharArray();
        
        public static void main(String[] args) {
            UUID uuid = UUID.randomUUID();
            System.out.println(uuid.toString());
            System.out.println(toHexGuid(uuid));
        }
        
        public static String toHexGuid(UUID uuid) {
            char[] chs = new char[32];
            toHex(chs, uuid.getMostSignificantBits(), 0);
            toHex(chs, uuid.getLeastSignificantBits(), 16);
            return new String(chs);
        }
        
        private static void toHex(char[] chs, long num, int startIndex) {
            for(int i = startIndex, k = startIndex + 16 - 1; i <= k; i++) {
                chs[i] = HEX[(int)(num >>> ((k - i) * 4) & 0xf)];
            }
        }
    }
      

  4.   

    你也可以看看这篇文章:使用 Apache OpenJPA 开发 EJB 3.0 应用,第 5 部分: 实体标识的自动生成这个是 OpenJPA 的 JPA 实现,不知道你用的 JPA 实现是 OpenJPA,还是 Hibernate,抑或是 TopLink?反正要使用 Oracle 的 sys_guid() 函数需要与数据库多交互一次,得不偿失!
      

  5.   

    JPA是规范,看LZ用哪个厂商的ORM来实现。以Hibernate实现JPA为例,uuid主键产生方式为: @Id
    @Column(length=36,name="uuid")
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid",strategy="uuid")
    protected String id;
      

  6.   

    个人感觉用JPA好处之一就是屏蔽底层异构的数据库,所以UUID还是在实体Bean的构造函数中自己用代码生成吧