有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MS SQL:ID(int)可以工作,但JPA插入操作的rowguid(uniqueidentifier)失败

我需要使用uniqueidentifier作为每个表的主键,而不是ID(整数)。下面描述的逻辑适用于ID(整数),而不适用于rowguid(uniqueidentifier)

我在(MS SQL Server)数据库中有以下表格

CREATE TABLE Person(
        [ROWGUID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT             [DF_PERSON_ROWGUID]  DEFAULT (newsequentialid()),
        [NICKNAME] [varchar](15) NULL,
        [EMAIL] [varchar](50) NULL,
        [DATE_OF_BIRTH] [date] NULL)


 CREATE TABLE School(
            [ROWGUID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT             [DF_PERSON_ROWGUID]  DEFAULT (newsequentialid()),
            [PERSONID] [varchar](15) NULL,
            [EMAIL] [varchar](50) NULL,
            [DATE_OF_BIRTH] [date] NULL)

这是一种一对多的关系(一个人可能有多个学校)。学校表的PERSONID是Person表的ROWGUID

在JPA方面,问题是,我无法在学校中插入Person对象。然而,我能够

  • 将Person对象单独插入到表中
  • 为某人制作select语句并检索其学校。所以我相信这证明了FK关系运作良好

回到我无法插入的问题;当我试图坚持的时候,我有以下的例外

无法将值NULL插入表'SCHOOL'的'PERSONID'列中;列不允许空值。插入失败

因此,基本上,它不能创建Person对象,生成其ROWGUID,然后将其连接到表School的PERSONID列。这是我的推测。我相信这是因为我在JPA端生成ID的方式。这是怎么回事

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ROWGUID", columnDefinition = "uniqueidentifier")
    private String rowguid;
    ...


public class School implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ROWGUID", columnDefinition="uniqueidentifier")
    private String rowguid;

//bi-directional many-to-one association to Person
    @ManyToOne
    @JoinColumn(name="PROFILEID")
    private Person person;

    public School() {
    }
    ...

你知道如何克服它吗

重要提示:当每个实体的主键为ID(int)时,相同的逻辑工作正常,如下所示:

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID")
    private int id;


 public class School implements Serializable {
        private static final long serialVersionUID = 1L;

      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      @Column(name="ID")
      private int id;

    //bi-directional many-to-one association to Person
        @ManyToOne
        @JoinColumn(name="PROFILEID")
        private Person person;

        public School() {
        }

当我转换下一代ID时,基本上有问题

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID")
    private int id;

进入

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ROWGUID", columnDefinition="uniqueidentifier")
    private String rowguid;

共 (1) 个答案

  1. # 1 楼答案

    这是一个标准实现:

    父子关系(父表中的主键,子表中的FK):

    @Entity(name ="Parent")
    public class Parent {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private String parentID;
    
        @ManyToMany(mappedBy = "parent") 
        private List<Child> children;
    }
    
    @Entity(name ="Child")
    public class Child{
        @Id
        private String parentID;
    
        @ManyToMany
        @JoinColumn(name="parentID")
        private Parent parent;
    }
    

    我想你的设计可能有问题。 无法将值NULL插入表'SCHOOL'的'PERSONID'列中 把PersonID放在学校桌子里听起来很奇怪