求助:关于实体类设计(使用Hibernate)

兜爷的小号 2011-08-15 04:47:39
在进行实体类设计的时候,有个比较纠结的问题,希望有经验的朋友帮助:
举个很简单的例子,有用户类(User)和审批信息类(Approve),用户类如下:

public Class User {
private Long id;
private String userName;
private String realName;
private String password;

//setters & getters ...
}


那么在设计Approve类的时候,应该:

private User approver;

还是应该:

private Long approverId;
private String approverName;

希望各位有经验的朋友能说明一下两种方式的优缺点

补充:ORM框架使用Hibernate.
...全文
111 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
兜爷的小号 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liuyuhua0066 的回复:]

过于庞大?指哪方面?

引用 7 楼 hymer2011 的回复:
感谢楼上的两位,yxk19890903和liuyuhua0066,不过我觉得在User中加Approve的集合不太好,因为User可能跟其他实体还有关联关系,比如用户信息,比如发表的文章等等,如果都在User里加List或者Set,那这个User是不是过于庞大了?
[/Quote]

我觉得不应该在User中持有Approve的集合,因为这样相当于把Approve捆绑给User了,在实际中,如果用户没有审批权限,也就是说,该用户不持有任何Approve。


比较赞同楼上yxk19890903的观点。
风火轮 2011-08-15
  • 打赏
  • 举报
回复
那就是在
public Class Approve{
private Long approverId;
private String approverName;
private User user;
}

在设计表结构的时候用多对一关系映射 如果是hibernate那就在Approve类的映射文件中
加如下
<many-to-one name="user" class="User" fetch="select">
<column name="userId" precision="10" scale="0" />
</many-to-one>
但是当你删除User信息的时候要写代码去删除有关系的Approve信息

其实不管是什么框架作为持久层 还是直接
public Class Approve{
private Long approverId;
private String approverName;
private Long userId;
}
这样比较好

根据需要用userId去User表查询User类
tanrenzong1986 2011-08-15
  • 打赏
  • 举报
回复
首先,要确认user和approver两者间是什么关联关系,其次从对象的角度来说最好是用对象形式。
GIS__ 2011-08-15
  • 打赏
  • 举报
回复
如果是1:N的话。。维护关系要放到1那边
比如一个User对象对应多个Approve
那么User实体
User {
private Long id;
private String userName;
private String realName;
private String password;
private List<Approve> approves;//泛型
}
Approve实体
Approve{
private Long approverId;
private String approverName;
}


liuyuhua0066 2011-08-15
  • 打赏
  • 举报
回复
过于庞大?指哪方面?

[Quote=引用 7 楼 hymer2011 的回复:]
感谢楼上的两位,yxk19890903和liuyuhua0066,不过我觉得在User中加Approve的集合不太好,因为User可能跟其他实体还有关联关系,比如用户信息,比如发表的文章等等,如果都在User里加List或者Set,那这个User是不是过于庞大了?
[/Quote]
兜爷的小号 2011-08-15
  • 打赏
  • 举报
回复
感谢楼上的两位,yxk19890903和liuyuhua0066,不过我觉得在User中加Approve的集合不太好,因为User可能跟其他实体还有关联关系,比如用户信息,比如发表的文章等等,如果都在User里加List或者Set,那这个User是不是过于庞大了?
liuyuhua0066 2011-08-15
  • 打赏
  • 举报
回复
那就写Approve属性,即:

private Long approverId;
private String approverName;


然后在User配置Set<Approve> appSet对应多端的Approve,在Approve配置User user对应单端的User。

风火轮 2011-08-15
  • 打赏
  • 举报
回复
public Class User {
private Long id;
private String userName;
private String realName;
private String password;

private List<Approve> approves;
//setters & getters ...
}

public Class Approve{
private Long approverId;
private String approverName;
}




兜爷的小号 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuyuhua0066 的回复:]

User和Approve什么映射关系?
[/Quote]
User和Approve是一对多。
liuyuhua0066 2011-08-15
  • 打赏
  • 举报
回复
User和Approve什么映射关系?
兜爷的小号 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 softroad 的回复:]

private User approver;

面向对象编程
[/Quote]
首先,多谢您的回答,如果用private User approver,那么在数据库中已经存在的Approve记录,如果删除其对应的用户,是否会影响Approve表中的记录(删除或者是清空ApproverId字段)?
softroad 2011-08-15
  • 打赏
  • 举报
回复
private User approver;

面向对象编程

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧