Postgres不知道数据FK(壮举JPA)


@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "Calendar")
@IdClass(CalendarPK.class)
public class Calendar {

@Id
private int year;

@Id
private int month;

@Id
private int day;

@MapsId
@OneToMany
@JoinColumns({
@JoinColumn(name = "year"),
@JoinColumn(name = "month"),
@JoinColumn(name = "day"),
})
List<CalendarData> CalendarDataList;

}
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
@IdClass(CalendarDataPK.class)
@SequenceGenerator(
name = "CALENDAR_DATA_GENERATOR",
sequenceName = "CALENDAR_DATA_SEQUENCE",
initialValue = 1,
allocationSize = 1)
@Table(name = "CalendarData")
public class CalendarData {


@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CALENDAR_DATA_SEQUENCE")
private long seq; 

@Id
private int year;

@Id
private int month;

@Id
private int day;

private long userId;

}

@Getter
public class CalendarDataPK extends CalendarPK {

private static final long serialVersionUID = 1L;
private long seq;
}
@EqualsAndHashCode
public class CalendarPK implements Serializable {

private static final long serialVersionUID = 1L;

private int year;
private int month;
private int day;
}

我创建了这个代码和测试(PG ADMIN)

插入日历(年、月、日)值(2021、2、10);→成功

insert into calendar_data(年,月,日,seq) values(2021,2,10,1);→失败

错误日志DETAIL:(年,月,日)=(2021,2,10)键在"日历"中不存在表。

有什么问题吗?

JPA下的DDL

------------------------------------------------------
CREATE TABLE public.calendar_data
(
seq bigint NOT NULL,
day integer NOT NULL,
month integer NOT NULL,
year integer NOT NULL,
CONSTRAINT calendar_data_pkey PRIMARY KEY (seq),
CONSTRAINT fkfl96et9e3y700rv08r7rq9wfu FOREIGN KEY (month, year, day)
REFERENCES public.calendars (month, day, year) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.calendar_data
---------------------
CREATE TABLE public.calendars
(
day integer NOT NULL,
month integer NOT NULL,
year integer NOT NULL,
CONSTRAINT calendars_pkey PRIMARY KEY (day, month, year)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE public.calendars
---------------------------------------------------------------

我解决了…

Just I needreferencedColumnName

@JoinColumns({
@JoinColumn(name = "year",referencedColumnName = "year"),
@JoinColumn(name = "month",referencedColumnName = "month"),
@JoinColumn(name = "day",referencedColumnName = "day")
})

I think column location is cause

hibernate log下面的

按原样

Hibernate: create table calendar (day int4 not null, month int4 not null, year int4 not null, 
primary key (day, month, year))
...
Hibernate: alter table if exists calendar_data add constraint FKd5kpvvc1pj0r9rifkqnf89ui9 
foreign key (year, month, day) references calendar

将来(添加referencedColumnName)

Hibernate: create table calendar (day int4 not null, month int4 not null, year int4 not null, 
primary key (day, month, year))
...
Hibernate: alter table if exists calendar_data add constraint FKd5kpvvc1pj0r9rifkqnf89ui9 
foreign key (day, month, year) references calendar