非常简单的用例。实体Pet对客户是多对一:
@ManyToOne(targetEntity = Customer.class, optional = false)
private Customer customer;
Customer实体本身具有对Pet的引用
@OneToMany(targetEntity = Pet.class)
private List<Pet> pets;
。
以下是生成的实体关系图:
生成的DDL为:
create table customer (
id bigint generated by default as identity,
name varchar(255),
notes varchar(255),
phone_number varchar(255),
primary key (id)
)
create table customer_pets (
customer_id bigint not null,
pets_id bigint not null
)
create table pet (
id bigint generated by default as identity,
birth_date date,
name varchar(255),
notes varchar(255),
type integer,
customer_id bigint not null,
primary key (id)
)
alter table customer_pets
add constraint UK_e3o1kteg0lcbv0x7ootmqr9be unique (pets_id)
alter table customer_pets
add constraint FKgg2of4dlj1tcnp4we00jnym8n
foreign key (pets_id)
references pet
alter table customer_pets
add constraint FK3vxa5mji0399s17amtnv2f2qj
foreign key (customer_id)
references customer
alter table pet
add constraint FKt742r2fu4c3i9sn6a8kv0k746
foreign key (customer_id)
references customer
实体的完整定义为:
@Entity
@Table
@Data
@NoArgsConstructor
public class Pet implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private PetType type;
private String name;
@ManyToOne(targetEntity = Customer.class, optional = false)
private Customer customer;
private LocalDate birthDate;
private String notes;
}
@Entity
@Table
@Data
@NoArgsConstructor
public class Customer implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private String phoneNumber;
private String notes;
@OneToMany(targetEntity = Pet.class)
private List<Pet> pets;
public void insertPet(Pet pet) {
pets.add(pet);
}
}
为什么Hibernate会创建两个连接表 customer_pets,但同时保留一个从 Pet到Customer 的FK?
我也使用过JoinColumn,但还是一样!
1条答案
按热度按时间deyfvvtc1#
这是因为你的Map是错误的。你必须告诉Hibernate哪个一对一的关联Map这个一对多的关联,例如,用途: