iteye_15788 2010-04-02 12:17
浏览 448
已采纳

hibernate 一对多的保存问题,望赐教

one
public class DCompany extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = 2472916124848152035L;

/**
 * 公司标识
 */
@Id
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
private String comId;
/**
 * 公司名称
 */
private String comName;
/**
 * 用户信息
 */
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "comId")
private List<DUser> users;
/**
 * 公司地址
 */
private String comAddress;
/**
 * 公司经营类别
 */
private String comType;
/**
 * 公司简介
 */
private String comIntro;
/**
 * 公司电话
 */
private String comTel;
/**
 * 增加时间
 */
private String comCreateDate;

many
public class DUser extends BaseEntity {

/**
 * 
 */
private static final long serialVersionUID = -7733922431721279323L;
/**
 * 用户标识
 */
@Id
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
private String userId;
/**
 * 姓名
 */
private String userName;
/**
 * 所属公司信息
 */
@ManyToOne
@JoinColumn(name = "comId")
private DCompany company;
/**
 * 性别标识M.男F.女
 */
private String userSex;
/**
 * 密码
 */
private String userPass;
/**
 * Email
 */
private String userEmail;
/**
 * 电话
 */
private String userTel;
/**
 * qq
 */
private String userQq;
/**
 * 是否冻结 0冻结 1正常
 */
private Integer userEnable;
/**
 * 创建时间
 */
private Timestamp userCreateDate;

现在数据库里的数据都是空的,没有记录,我想实现的是DCompany 和DUser一起保存在数据库中

比如jsp页面文本框信息如下:

公司名:
公司地址:
公司电话:
姓名:
性别:
QQ:

也就是页面上一次录入DCompany 实体信息与DUser实体信息,然后一点保存,分别把DCompany 信息保存到DCompany 表,DUser信息保存到DUser表中

我的测试代码是这么写的:

DCompany company = new DCompany();
company.setComName("北京时间有限公司");
company.setComAddress("朝阳区酒仙桥1号");
company.setComIntro("介绍信息写这里");
company.setComTel("010-38782121");
company.setComType("test");
DUser user = new DUser();
user.setUserName("test");
user.setUserEmail("test@188.com");
user.setUserPass("123afb");
user.setUserEnable(1);
user.setUserSex("M");
user.setUserTel("13811112121");
user.setUserQq("21232221");

    List list = new ArrayList();
    list.add(user);
    company.setUsers(list);
    companyService.saveCompany(company);

可是保存不进去,DUser表里有comId,这样以来如果没有先保存DCompany 信息是不会有comId的,报错
object references an unsaved transient instance - save the transient instance before flushing: org.wdj.base.entity.DUser; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.wdj.base.entity.DUser

请问 该如何做呢,谢谢

  • 写回答

3条回答

  • iteye_13460 2010-04-02 13:13
    关注

    报的下面的这个错误是因为你这两个类之间没有设置级联.
    object references an unsaved transient instance - save the transient instance before flushing: org.wdj.base.entity.DUser; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.wdj.base.entity.DUser

    也就是说DCompany对象时,DCompany类中定义的DUser不会自动保存,
    所以你要在DCompany中DUser上这样设置:
    [code="java"]
    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name = "comId")
    private Set users = new HashSet();
    [/code]
    注意:我们一般使用Set,而不是List

    完整的代码:
    [code="java"]

    public class DCompany extends BaseEntity {

    /**
     * 
     */
    private static final long serialVersionUID = 2472916124848152035L;
    
    /**
     * 公司标识
     */
    @Id
    @GeneratedValue(generator = "paymentableGenerator")
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    private String comId;
    /**
     * 公司名称
     */
    private String comName;
    /**
     * 用户信息
     */
    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name = "comId")
    private Set<DUser> users = new HashSet<DUser>();
    /**
     * 公司地址
     */
    private String comAddress;
    /**
     * 公司经营类别
     */
    private String comType;
    /**
     * 公司简介
     */
    private String comIntro;
    /**
     * 公司电话
     */
    private String comTel;
    /**
     * 增加时间
     */
    private String comCreateDate;
    

    }
    [/code]

    [code="java"]
    public class DUser extends BaseEntity {

    /**
     * 
     */
    private static final long serialVersionUID = -7733922431721279323L;
    /**
     * 用户标识
     */
    @Id
    @GeneratedValue(generator = "paymentableGenerator")
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    private String userId;
    /**
     * 姓名
     */
    private String userName;
    /**
     * 所属公司信息
     */
    @ManyToOne
    @JoinColumn(name = "comId")
    private DCompany company;
    /**
     * 性别标识M.男F.女
     */
    private String userSex;
    /**
     * 密码
     */
    private String userPass;
    /**
     * Email
     */
    private String userEmail;
    /**
     * 电话
     */
    private String userTel;
    /**
     * qq
     */
    private String userQq;
    /**
     * 是否冻结 0冻结 1正常
     */
    private Integer userEnable;
    /**
     * 创建时间
     */
    private Timestamp userCreateDate;
    

    }

    [/code]

    希望能帮助你.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误