此数据库的正确 JPA 实体映射是什么?

What is the correct JPA entity mapping for this database?

所以,这是数据库:

drop database if exists demo;
create database demo;
use demo;

create table user_entity(
user_id INT primary key auto_increment,
user_name varchar(30),
medicine_id int
);

create table medicine_entity(
medicine_id int primary key auto_increment,
medicine_name varchar(30)
);

alter table user_entity
add foreign key(medicine_id) references medicine_entity(medicine_id);

insert into medicine_entity(medicine_name) values('paracetamol');
insert into medicine_entity(medicine_name) values('vix');

insert into user_entity(user_name, medicine_id) values('a',1);
insert into user_entity(user_name, medicine_id) values('a',2);
insert into user_entity(user_name, medicine_id) values('b',2);
insert into user_entity(user_name, medicine_id) values('c',1);

此数据库的适当映射是什么,实体 类 :

UserEntity.class :

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class UserEntity
{
public UserEntity()
{
super();
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long userId;
private String userName;
@ManyToMany
private Set<MedicineEntity> medicineId;

public long getUserId()
{
return userId;
}

public void setUserId(long userId)
{
this.userId = userId;
}

public String getUserName()
{
return userName;
}

public void setUserName(String userName)
{
this.userName = userName;
}

public Set<MedicineEntity> getMedicineId()
{
return medicineId;
}

public void setMedicineId(Set<MedicineEntity> medicineId)
{
this.medicineId = medicineId;
}

}

MedicineEntity.class:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class MedicineEntity
{

public MedicineEntity()
{
super();
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long medicineId;
private String medicineName;
@ManyToMany
private Set<UserEntity> userId;

public long getMedicineId()
{
return medicineId;
}

public void setMedicineId(long medicineId)
{
this.medicineId = medicineId;
}

public String getMedicineName()
{
return medicineName;
}

public void setMedicineName(String medicineName)
{
this.medicineName = medicineName;
}

}

我正在考虑两个实体上的@ManyToMany 关系,但不确定。所以,请帮助我用正确的关系映射更正代码,并详细说明为什么使用这种关系,更正的作用是什么,请不要关闭这个问题。

该数据库的映射:

@Entity
@Table(name="user_entity")
public class UserEntity {

public class UserEntity() {}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_id")
private Integer userId;

@Column(name="user_name")
private String userName;

@ManyToOne
@JoinColumn(name="medicine_id")
private MedicineEntity medicineEntity;

...
}

@Entity
@Table(name="medicine_entity")
public class MedicineEntity() {}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="medicine_id")
private Integer medicineId;

@Column(name="medicine_name")
private String medicineName;

// (Optional) If you want a bidirectional association
@OneToMany(mappedBy="medicine_id")
private Set<UserEntity> userId;
...
}

这不是多对多,因为它需要额外的 table 来映射 UserEntityMedicineEntity 之间的关系(table user_medicine 例如)。

有关 mapping associations 的更多详细信息,请参阅 Hibernate ORM 文档。

此外,我不鼓励使用原始类型作为标识符。您将无法将它们设置为 null 这样更容易弄清楚 当一个实体没有 id 时(否则你必须检查 0 或更大)