zoukankan      html  css  js  c++  java
  • Play框架的@OneToMany、@ManyToOne级联操作

    对象之间有一对一,一对多,多对一,多对多的关系,Play框架底层使用hibernate模板,所以可以用注释@OneToOne,@OneToMany,@ManyToOne和@ManyToMany来表示他们之间的关系。但是再利用@ManyToOne进行保存时出现了错误,直到今天才解决。

    1. 错误再现

    报错如下

    错误.jpg

    大概意思就是在级联保存的时候出错了,在刷新前还没有保存瞬时实例。

    代码如下

    Model如下:这是和级联相关的一部分

    @Entity(name = "houses")
    public class Houses extends Model {
            // 装修程度
        @OneToOne
        public Decorates decorates;
            //联系人
        @OneToMany(cascade=CascadeType.ALL)
        @JoinColumn(name="house_id")
        public List<Linkmans> linkman;
        //发布者
        @OneToOne
        public Users user;
    }
    public static void publish(Houses houses, List<Linkmans> linkmansList, Decorates decorates)
                throws FileNotFoundException {
            // 保存装修类型
            decorates.save();
            houses.decorates = decorates;
            houses.save();
    
            // ***保存联系人操作开始,页面***
                    houses.linkman = linkmansList;
            for (Linkmans man : linkmansList) {
                man.house_id = houses.id;
                man.save();
            }
            // ***结束***
            render("newhouse/success.html");
        }

    1、Hibernate持久化的三种状态:
    1) 临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;
    2) 持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;
    3) 游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;

    其中多对一可以顺利保存,但是一对多无法保存。这种情况下,如果只有一个联系人可以正常保存,但是多个联系人就无法保存,报以上错误。刷新前没有保存瞬时实例就是说linkmans还在临时状态,没有保存,所以无法级联。

    要怎么做才对

    // ***保存联系人操作开始,页面***
            for (Linkmans man : linkmansList) {
                man.house_id = houses.id;
                man.save();
            }
            houses.linkman = linkmansList;
            // ***结束***

    修改了保存联系人和将房子与联系人级联的先后顺序就正确了。也就是说先把多个联系人依次保存到数据库,从临时状态变成持久化状态,然后再将房子和联系人级联保存,这样就正确了。

    总算解决了,有时候解决问题就需要转变一下小思维,嘿嘿。

  • 相关阅读:
    在C#代码中应用Log4Net(二)典型的使用方式
    在C#代码中应用Log4Net(一)简单使用Log4Net
    Windows Azure Active Directory (2) Windows Azure AD基础
    Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
    Windows Azure Active Directory (1) 前言
    Azure China (6) SAP 应用在华登陆 Windows Azure 公有云
    Microsoft Azure News(3) Azure新的基本实例上线 (Basic Virtual Machine)
    Microsoft Azure News(2) 在Microsoft Azure上运行SAP应用程序
    Microsoft Azure News(1) 新的数据中心Japan East, Japan West and Brazil South
    Windows Azure HandBook (2) Azure China提供的服务
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185260.html
Copyright © 2011-2022 走看看