栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Hibernate一对多和多对多

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate一对多和多对多

一对多 一对多 单向
@Entity
@Table(name = "cz_user")
public class Users {

    @Column(name = "user_id")
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer userId;
    @Column(name = "user_name")
    private String username;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;
    @Column(name = "reg_time")
    private Date regTime;

    
    @OneToMany(cascade = CascadeType.ALL,orphanRemoval = true)
   @JoinColumn(name = "user_id")//外键维护
    private List
addressList = new ArrayList
(); public Users() { } //这里属性的get方法需要有,set方法不需要,当然你可以加上
@Entity
@Table(name = "cz_address")
public class Address {

    @Column(name = "address_id")
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer addressId;
    @Column(name = "consignee")
    private String consignee;
    @Column(name = "province")
    private Integer province;
    @Column(name = "city")
    private Integer city;
    @Column(name = "district")
    private Integer district;
    @Column(name = "street")
    private String street;
    @Column(name = "zipcode")
    private String zipcode;
    @Column(name = "telphone")
    private String telphone;
    @Column(name = "mobile")
    private String mobile;

    public Address() {
    }
     //这里属性的get方法需要有,set方法不需要,当然你可以加上
@Transactional
@Override
    public void test() {
        List
addresses = new ArrayList
(); Address consignee1 = new Address("consignee12", 12, 12, 12); Address consignee2 = new Address("consignee22", 22, 22, 22); Address consignee3 = new Address("consignee32", 32, 32, 32); Address consignee4 = new Address("consignee42", 42, 42, 42); addresses.add(consignee1); addresses.add(consignee2); addresses.add(consignee3); addresses.add(consignee4); Users users1 = new Users(null, "username2", "email2", "password2", new Date(), addresses); userAddressDao.saveUser(users1); if (addresses != null && addresses.size() > 0){ for (Address address : addresses) { userAddressDao.updateAddress(address,users1.getUserId()); } } }
public void saveUser(Users users) {
        getCurrentSession().save(users);
    }
@Override
    public void updateAddress(Address address,int user_id) {
        int o = getCurrentSession().createQuery("update "+Address.class.getName()+" set user_id = :user_id where addressId = :addressId")
                .setParameter("user_id",user_id)
                .setParameter("addressId",address.getAddressId())
                .executeUpdate();
        logger.warn("外键成功:" + o);
    }

这种单向一对多的级联保存,只需要保存"一方",保存成功之后,“一方”,"多方"的主键会自动回填,然后再去更新外键。这种单向的一对多情况下,"多方"基本上我们是使用不到的。

一对多 双向
@Entity
@Table(name = "cz_user")
public class Users {

    @Column(name = "user_id")
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer userId;
    @Column(name = "user_name")
    private String username;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;
    @Column(name = "reg_time")
    private Date regTime;


    @OneToMany(cascade = CascadeType.ALL,orphanRemoval = true,mappedBy = "users")
    private List
addressList = new ArrayList
(); public Users() { } //这里属性的get方法需要有,set方法不需要,当然你可以加上
@Entity
@Table(name = "cz_address")
public class Address {

    @Column(name = "address_id")
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer addressId;
    @Column(name = "consignee")
    private String consignee;
    @Column(name = "province")
    private Integer province;
    @Column(name = "city")
    private Integer city;
    @Column(name = "district")
    private Integer district;
    @Column(name = "street")
    private String street;
    @Column(name = "zipcode")
    private String zipcode;
    @Column(name = "telphone")
    private String telphone;
    @Column(name = "mobile")
    private String mobile;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")//外键
    private Users users;
 //这里属性的get方法需要有,set方法不需要,当然你可以加上
@Transactional
 @Override
    public void test() {
        List
addresses = new ArrayList
(); Address consignee1 = new Address("consignee12", 12, 12, 12); Address consignee2 = new Address("consignee22", 22, 22, 22); Address consignee3 = new Address("consignee32", 32, 32, 32); Address consignee4 = new Address("consignee42", 42, 42, 42); addresses.add(consignee1); addresses.add(consignee2); addresses.add(consignee3); addresses.add(consignee4); Users users1 = new Users(null, "username2", "email2", "password2", new Date(), addresses); userAddressDao.saveUser(users1); if (addresses != null && addresses.size() > 0){ for (Address address : addresses) { userAddressDao.updateAddress(address,users1.getUserId()); } } }
  @Override
    public void saveUser(Users users) {

        getCurrentSession().save(users);
    }

    @Override
    public void updateAddress(Address address,int user_id) {
        int o = getCurrentSession().createQuery("update "+Address.class.getName()+" set user_id = :user_id where addressId = :addressId")
                .setParameter("user_id",user_id)
                .setParameter("addressId",address.getAddressId())
                .executeUpdate();
        logger.warn("外键成功:" + o);
    }

这种单向一对多的级联保存,只需要保存"一方",保存成功之后,“一方”,"多方"的主键会自动回填,然后再去更新外键。这种双向的一对多情况下,是使用最多的
上面两种情况的执行结果

Hibernate: 
    insert 
    into
        cz_user
        (email, password, reg_time, user_name) 
    values
        (?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cz_address
        (city, consignee, district, mobile, province, street, telphone, user_id, zipcode) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cz_address
        (city, consignee, district, mobile, province, street, telphone, user_id, zipcode) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cz_address
        (city, consignee, district, mobile, province, street, telphone, user_id, zipcode) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cz_address
        (city, consignee, district, mobile, province, street, telphone, user_id, zipcode) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    update
        cz_address 
    set
        user_id=? 
    where
        address_id=?
2021-11-16 15:07:33,193 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
Hibernate: 
    update
        cz_address 
    set
        user_id=? 
    where
        address_id=?
2021-11-16 15:07:33,221 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
Hibernate: 
    update
        cz_address 
    set
        user_id=? 
    where
        address_id=?
2021-11-16 15:07:33,251 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
Hibernate: 
    update
        cz_address 
    set
        user_id=? 
    where
        address_id=?
2021-11-16 15:07:33,309 WARN [com.xysd.ssh.repository.UserAddressDaoImpl] - 外键成功:1
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号