【问题标题】:What is the correct JPA entity mapping for this database?该数据库的正确 JPA 实体映射是什么?
【发布时间】:2021-06-28 17:05:25
【问题描述】:

所以,这是数据库:

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

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

用户实体类:

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 关系,但不确定。所以,通过正确的关系映射更正代码来帮助我,并详细说明为什么要使用这种关系,更正的作用是什么,请不要关闭这个问题。

【问题讨论】:

  • 对于ManyToMany 映射,您需要单独的映射表来映射用户和药物。
  • 请正确格式化您的代码。 --- 由于关系归 user_entity 所有,@ManyToOne on UserEntity@OneToMany on MedicineEntity 仅在需要时)似乎合适。如果单个用户可以拥有多种药物,则将使用多对多关系。

标签: java spring-boot jpa hibernate-mapping entity-relationship


【解决方案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;
...
}

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多