@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