CREATE TABLE user_course

 多对多关系并不是两张表的关系,而是三张表的关系,而且要求必须有一个中间表,中间表必须只有两个字段,必须为复合主键,必须包含外键。

  如果以上条件都满足,MyEclipse在三张表一起选择时,就可以生成多对多关系映射。

  类一般只生成两个类,例如:学生选课中,只生成学生和课程类,关系使用以下方式描述:

  1)  学生类中保存着该学生选择的所有课程对象,使用Set集合来保存。

  2)  课程类中保存着所有选择此课程的学生对象,使用Set集合来保存。

  建立数据表

  CREATE TABLE user_course (

  userid               varchar2(40)             ,

  course_id            number(8)                ,

  primary key (userid,course_id) ,

  foreign key (userid) references t_user (userid) on delete cascade ,

  foreign key (course_id) references course (id) on delete cascade

  );

  使用t_user,course和user_course表,完成映射:

  many to many 前面打勾:

  由于t_user使用assigned,course使用increment,因此,这里不统一选择方式。

  而是在后面单独选择。

  同时,注意将允许使用多对多的多选框选中。

  可以在这里单独选择方式。

  public class TUser implements java.io.Serializable {

  private String userid;

  private String realName;

  private String password;

  private Date registDate;

  private Date lastLoginDate;

  private Set courses = new HashSet(0);

  public class Course implements java.io.Serializable {

  private Integer id;

  private String title;

  private Set TUsers = new HashSet(0);

  类中确定了集合关系

  映射文件里也描述了多对多关系:

  <?xml version="1.0" encoding="utf-8"?>

  <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

  <hibernate-mapping>

  <class name="org.liky.pojo.TUser" table="T_USER" schema="SUNXUN">

  <id name="userid" type="java.lang.String">

  <column name="USERID" length="40" />

  <generator class="assigned"></generator>

  </id>

  <property name="realName" type="java.lang.String">

  <column name="REAL_NAME" length="20" not-null="true" />

  </property>

  <property name="password" type="java.lang.String">

  <column name="PASSWORD" length="32" not-null="true" />

  </property>

  <property name="registDate" type="java.util.Date">

  <column name="REGIST_DATE" length="7" />

  </property>

  <property name="lastLoginDate" type="java.util.Date">

  <column name="LAST_LOGIN_DATE" length="7" />

  </property>

  <!--

  在User中包含一个名称为courses的Set集合,数据是根据中间表USER_COURSE来关联取得的。

  -->

  <set name="courses" table="USER_COURSE" schema="SUNXUN">

  <!--

  中间表中通过USERID与当前类(User)关联

  -->

  <key>

  <column name="USERID" length="40" not-null="true" />

  </key>

  <!--

  中间表还通过COURSE_ID与Course对象关联,联系起来出现的是多对多关系。

  -->

  <many-to-many entity-name="org.liky.pojo.Course">

  <column name="COURSE_ID" precision="8" scale="0" not-null="true" />

  </many-to-many>

  </set>

  </class>

  </hibernate-mapping>

  <?xml version="1.0" encoding="utf-8"?>

  <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

  <!--

  Mapping file autogenerated by MyEclipse Persistence Tools

  -->

  <hibernate-mapping>

  <class name="org.liky.pojo.Course" table="COURSE" schema="SUNXUN">

  <id name="id" type="java.lang.Integer">

  <column name="ID" precision="8" scale="0" />

  <generator class="increment"></generator>

  </id>

  <property name="title" type="java.lang.String">

  <column name="TITLE" length="50" not-null="true" />

  </property>

  <set name="TUsers" inverse="true" table="USER_COURSE" schema="SUNXUN">

  <key>

  <column name="COURSE_ID" precision="8" scale="0" not-null="true" />

  </key>

  <many-to-many entity-name="org.liky.pojo.TUser">

  <column name="USERID" length="40" not-null="true" />

  </many-to-many>

  </set>

  </class>

  </hibernate-mapping>

  可以发现有一边的配置中出现了inverse="true",这个配置表示关联关系由对方进行维护。

表结构设计 1. 商品表 (products) 字段名 数据类型 约束 描述 id INTEGER PRIMARY KEY AUTOINCREMENT 商品唯一ID name TEXT NOT NULL 商品名称 price REAL NOT NULL 商品价格 image_res_id TEXT NOT NULL 图片资源名称 SQL创建语句: sql CREATE TABLE products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, price REAL NOT NULL, image_res_id TEXT NOT NULL ); 2. 用户表 (users) 字段名 数据类型 约束 描述 id INTEGER PRIMARY KEY AUTOINCREMENT 用户唯一ID username TEXT NOT NULL UNIQUE 用户名 password TEXT NOT NULL 密码 email TEXT 邮箱 SQL创建语句: sql CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password TEXT NOT NULL, email TEXT ); 3. 购物车项表 (cart_items) 字段名 数据类型 约束 描述 id INTEGER PRIMARY KEY AUTOINCREMENT 购物车项ID user_id INTEGER NOT NULL 用户ID product_id INTEGER NOT NULL 商品ID quantity INTEGER NOT NULL DEFAULT 1 数量 SQL创建语句: sql CREATE TABLE cart_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, product_id INTEGER NOT NULL, quantity INTEGER NOT NULL DEFAULT 1, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (product_id) REFERENCES products(id) ); 4. 订单表 (orders) 字段名 数据类型 约束 描述 id INTEGER PRIMARY KEY AUTOINCREMENT 订单ID user_id INTEGER NOT NULL 用户ID order_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 下单时间 total_amount REAL NOT NULL 总金额 SQL创建语句: sql CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, order_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, total_amount REAL NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) ); 5. 订单项表 (order_items) 字段名 数据类型 约束 描述 id INTEGER PRIMARY KEY AUTOINCREMENT 订单项ID order_id INTEGER NOT NULL 订单ID product_id INTEGER NOT NULL 商品ID quantity INTEGER NOT NULL 数量 price REAL NOT NULL 单价 SQL创建语句: sql CREATE TABLE order_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER NOT NULL, product_id INTEGER NOT NULL, quantity INTEGER NOT NULL, price REAL NOT NULL, FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) ); 数据库初始化脚本 sql -- 创建表 CREATE TABLE IF NOT EXISTS products (...); CREATE TABLE IF NOT EXISTS users (...); CREATE TABLE IF NOT EXISTS cart_items (...); CREATE TABLE IF NOT EXISTS orders (...); CREATE TABLE IF NOT EXISTS order_items (...); -- 初始化商品数据 INSERT INTO products (name, price, image_res_id) VALUES ('键盘', 199.9, 'keyboard'), ('鼠标', 99.9, 'mouse'), ('耳机', 299.9, 'headset'), ('显示屏', 999.9, 'monitor'), ('电脑', 4999.9, 'computer'), ('鼠标垫', 29.9, 'mousepad'); -- 创建索引 CREATE INDEX idx_cart_user ON cart_items(user_id); CREATE INDEX idx_orders_user ON orders(user_id); CREATE INDEX idx_order_items_order ON order_items(order_id); 数据库关系说明 商品与购物车项:一对多关系 一个商品可以出现在多个用户的购物车中 购物车项表通过product_id关联商品表 用户与购物车:一对多关系 一个用户可以有多个购物车项 购物车项表通过user_id关联用户表 用户与订单:一对多关系 一个用户可以下多个订单 订单表通过user_id关联用户表 订单与订单项:一对多关系 一个订单包含多个订单项 订单项表通过order_id关联订单表 商品与订单项:一对多关系 一个商品可以出现在多个订单中 订单项表通过product_id关联商品表 根据这些画一张er图
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值