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

Java 此数据库的正确JPA实体映射是什么?,java,spring-boot,jpa,hibernate-mapping,entity-relationship,Java,Spring Boot,Jpa,Hibernate Mapping,Entity Relationship,这就是数据库: 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_increme

这就是数据库:

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);
@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;
...
}
此数据库的适当映射是什么,实体类:

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;
}

}
import java.util.Set;
导入javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.ManyToMany;
@实体
公共类用户实体
{
公共用户实体()
{
超级();
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有长用户ID;
私有字符串用户名;
@许多
私人设置的medicineId;
公共长getUserId()
{
返回用户标识;
}
public void setUserId(长userId)
{
this.userId=userId;
}
公共字符串getUserName()
{
返回用户名;
}
public void setUserName(字符串用户名)
{
this.userName=用户名;
}
公共集getMedicineId()
{
返回药品ID;
}
公共无效setMedicineId(Set 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;
}

}
import javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
@实体
公共类医疗实体
{
公共医疗实体()
{
超级();
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长药房;
私有字符串medicineName;
@许多
私有设置用户标识;
公共长getMedicineId()
{
返回药品ID;
}
公共无效setMedicineId(长medicineId)
{
this.medicineId=medicineId;
}
公共字符串getMedicineName()
{
返回medicineName;
}
public void setMedicineName(字符串medicineName)
{
this.medicineName=medicineName;
}
}

我正在考虑两个实体上的@manytomy关系,但不确定。因此,请通过使用正确的关系映射更正代码来帮助我,并详细说明使用此关系的原因更正的作用是什么,请不要关闭此问题。

该数据库的映射:

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);
@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;
...
}
@实体
@表(name=“用户\实体”)
公共类用户实体{
公共类UserEntity(){}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“user\u id”)
私有整数用户标识;
@列(name=“user\u name”)
私有字符串用户名;
@许多酮
@JoinColumn(name=“medicine\u id”)
私营医疗实体;
...
}
@实体
@表(name=“medicine\u实体”)
公共类MedicineEntity(){}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“medicine\u id”)
私有整数medicineId;
@列(name=“medicine\u name”)
私有字符串medicineName;
//(可选)如果需要双向关联
@OneToMany(mappedBy=“medicine\u id”)
私有设置用户标识;
...
}
它不是多对多,因为它需要一个额外的表映射
UserEntity
MedicineEntity
之间的关系(例如,表
user\u medicine

有关详细信息,请参阅Hibernate ORM文档

此外,我不鼓励使用原语类型作为标识符。您不能将它们设置为null,这样更容易理解
当实体没有id时(否则您必须检查0或更大)

对于
manytomy
映射,您需要单独的映射表来映射用户和药物。请正确设置代码格式。--由于该关系由用户实体所有,因此
用户实体上的
@manytone
@OneToMany
上的
@medicineententity
仅在需要时)似乎是合适的。如果单个用户可以使用多种药物,则将使用多对多关系。