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 楼答案
这是一个标准实现:
父子关系(父表中的主键,子表中的FK):
我想你的设计可能有问题。 无法将值NULL插入表'SCHOOL'的'PERSONID'列中 把PersonID放在学校桌子里听起来很奇怪