CREATE TABLE advert ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '广告名称', position_id int(20) NOT NULL COMMENT '广告位置ID', media_id int(20) NOT NULL COMMENT '广告图片ID', link varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '广告链接', status int(1) unsigned zerofill NOT NULL COMMENT '状态,0:未启用,1:已启用,2:已结束', PRIMARY KEY (id) USING BTREE, KEY FK_ad_image (media_id), KEY FK_ad_position (position_id), CONSTRAINT FK_ad_image FOREIGN KEY (media_id) REFERENCES media_file (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT FK_ad_position FOREIGN KEY (position_id) REFERENCES ad_position (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告表'; CREATE TABLE ad_position ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '位置名称', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告位置表'; CREATE TABLE media_file ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(30) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件名称', type tinyint(1) NOT NULL COMMENT '媒体文件类型:0-图片,1-视频', url varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件URL地址', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告媒体文件表'; springboot项目用java写出三张表的orm对象(使用jpa外键依赖)并且对advert表的添加和删除操作不会影响ad_position表的数据
时间: 2024-02-27 19:57:03 浏览: 23
以下是使用JPA外键依赖的三张表的ORM对象:
Advert表的ORM对象:
```
@Entity
@Table(name = "advert")
public class Advert {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "position_id")
private AdPosition adPosition;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "media_id")
private MediaFile mediaFile;
@Column(name = "link")
private String link;
@Column(name = "status")
private Integer status;
// 构造函数、Getter、Setter方法省略
}
```
AdPosition表的ORM对象:
```
@Entity
@Table(name = "ad_position")
public class AdPosition {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "adPosition", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Advert> adverts = new ArrayList<>();
// 构造函数、Getter、Setter方法省略
}
```
MediaFile表的ORM对象:
```
@Entity
@Table(name = "media_file")
public class MediaFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "type")
private Integer type;
@Column(name = "url")
private String url;
@OneToMany(mappedBy = "mediaFile", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Advert> adverts = new ArrayList<>();
// 构造函数、Getter、Setter方法省略
}
```
在Advert表中,使用@ManyToOne注解创建与AdPosition表和MediaFile表之间的多对一关系,通过@JoinColumn注解指定外键的名称为position_id和media_id,并且设置fetch属性为LAZY,避免在查询Advert表时立即加载AdPosition表和MediaFile表的数据。
在AdPosition表和MediaFile表中,使用@OneToMany注解创建与Advert表之间的一对多关系,并且设置mappedBy属性为adPosition和mediaFile,表示Advert表中的adPosition和mediaFile属性维护了与AdPosition表和MediaFile表之间的关系。同时,设置cascade属性为CascadeType.ALL,表示级联保存、更新和删除操作,设置orphanRemoval属性为true,表示在Advert表中删除AdPosition表或MediaFile表的数据时,同时也会删除Advert表中对应的数据。
对于Advert表的添加和删除操作不影响AdPosition表和MediaFile表的数据,可以在AdPosition表和MediaFile表中设置@OneToMany注解的cascade属性为CascadeType.PERSIST和CascadeType.MERGE,表示只有在保存或更新Advert表时才会级联保存或更新AdPosition表和MediaFile表的数据,而在删除Advert表时不会级联删除AdPosition表和MediaFile表的数据。