hibernate配置问题?

zrcai 2009-11-16 04:20:57


create table empinfo(
empid varchar(10) primary key not null ,
empname varchar(10)
)


create table userinfo(
empid varchar(10) primary key not null foreign key references empinfo(empid),
password varchar(10),

)



userinfo 的empid与empinfo的empid是一一对应的,即登录的时候是用员工编号登录。
这个用Hibernate如何配置,和POJO如何写?
我写的时候总是怪怪的!主要是主键如何配置,
...全文
127 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
svse08 2009-11-17
  • 打赏
  • 举报
回复
不管用哪种一对一关联,你的表都是错的。
如果要用“一对一主键关联”,关联的两个实体共享一个主键值,数据库表结构应该:
两表之间的引用关系在映射文件中指定。
create table empinfo(
empid varchar(10) primary key not null ,
empname varchar(10)
)
create table userinfo(
empid varchar(10) primary key not null ,
password varchar(10)
)
如果你要用“一对一唯一外键关联”,数据库表结构应该:
create table empinfo(
empid varchar(10) primary key not null ,
empname varchar(10)
)
create table userinfo(
id int identity primary key
empid varchar(10) references empinfo(empid),--外键
password varchar(10)
)
PO和映射文件应该是基础知识,看书吧。别人都告诉你了,你只懂其表,不懂其理,所以最好还是自己看书。
道光2008 2009-11-17
  • 打赏
  • 举报
回复
测试:
Session session = sessionFactory.openSession();
SshRoom sr = new SshRoom();
sr.setRoomName("测试2");
SshStu ss = new SshStu();
ss.setStuName("测试2");
ss.setRoom(sr);
sr.setStu(ss);
Transaction tran = session.beginTransaction();
session.save(sr);
session.save(ss);
//session.flush();
tran.commit();
改为:
Session session = sessionFactory.openSession();
SshRoom sr = new SshRoom();
sr.setRoomName("测试21");
SshStu ss = new SshStu();
ss.setStuName("测试21");
//ss.setRoom(sr);
sr.setStu(ss);
Transaction tran = session.beginTransaction();
session.save(sr);
//session.save(ss);
//session.flush();
tran.commit();
保存被控对象SshRoom 是通过级联,默认了cascade属性为true
会自动先保存SshStu


wei_june 2009-11-17
  • 打赏
  • 举报
回复
sf
道光2008 2009-11-17
  • 打赏
  • 举报
回复
public class SshRoom
{

private String roomName;

private String roomId;
private SshStu stu;

public class SshStu
{

private String stuName;
private String stuId;
private SshRoom room;


<hibernate-mapping>

<class name="vo.SshStu" table="ssh_stu" >
<!-- <cache usage="read-write"/> -->
<id name="stuId" type="java.lang.String" >
<column name="stu_id" length="20"/>
<!-- <generator class="native" /> -->
<generator class="sequence">
<param name="sequence">S_USER</param>
</generator>
</id>

<property name="stuName" type="java.lang.String">
<column name="stu_name" length="20" />
</property>

<one-to-one name="room"
class="vo.SshRoom"
cascade="all"/>

</class>

</hibernate-mapping>


<hibernate-mapping>

<class name="vo.SshRoom" table="ssh_room" >
<!-- <cache usage="read-write"/> -->
<id name="roomId" type="java.lang.String" unsaved-value="null">
<column name="room_id" length="20"/>
<!-- <generator class="native" />
<generator class="sequence">
<param name="sequence">S_USER</param> -->

<generator class="foreign" >
<param name="property">stu</param>
</generator>
</id>

<property name="roomName" type="java.lang.String">
<column name="room_name" length="20" />
</property>

<one-to-one name="stu"
class="vo.SshStu"
/>

</class>

</hibernate-mapping>

测试:
Session session = sessionFactory.openSession();
SshRoom sr = new SshRoom();
sr.setRoomName("测试2");
SshStu ss = new SshStu();
ss.setStuName("测试2");
ss.setRoom(sr);
sr.setStu(ss);
Transaction tran = session.beginTransaction();
session.save(sr);
session.save(ss);
//session.flush();
tran.commit();

lvjianwu 2009-11-16
  • 打赏
  • 举报
回复
学习中
zcl198715 2009-11-16
  • 打赏
  • 举报
回复
因为userinfo 的empid与empinfo的empid是一一对应的,即登录的时候是用员工编号登录,那么就设计两个bean,一个是User,另一个是Employee,这两个bean是一对一主键关联就可以满足你的要求了,形如:

Employee类:
public class Employee {
private String empid;
private String emponame;
getter,setter...
}

User类:
public class User {
private String UserId; //UserId依赖于Employee的主键变化而变化
private String password;
private Employee employee;
setter, getter...
}


<!--User类的配置-->
<class name="User" table="t_userinfo">
<id name="UserId">
<generator class="foreign"> <!-- 依据Employ的主键-->
<param name="property">employee</param>
</generator>
</id>
<property name="password"/>
<one-to-one name="employee" constrained="true"/>
</class>
<!--Employee的配置文件-->
<class name="Employee" table="t_employee">
<id name="empid">
<!--通过程序手动分配,比较合理-->
<generator class="assign"/>
</id>
<property name="emponame"/>
</class>

没有经过验证,不知道可否满足?
andesen 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zrcai 的回复:]
有没有办法,还是要再建一个字段uid 主键,属性empid再引用empid
[/Quote]
嗯,新建一个uid自动标识列合理
zl3450341 2009-11-16
  • 打赏
  • 举报
回复
你这样还不如就建一张表
zl3450341 2009-11-16
  • 打赏
  • 举报
回复
..两表公用一个主键
你应该在userinfo表中有一个自己的主键
zrcai 2009-11-16
  • 打赏
  • 举报
回复
我是看一个项目里的表这样设计的,我想试一下能不能在Hibernate进行映射!
道光2008 2009-11-16
  • 打赏
  • 举报
回复
userinfo 需要自己的主键,你这样的表设计都不合理,还谈什么hibernate
zrcai 2009-11-16
  • 打赏
  • 举报
回复
有没有办法,还是要再建一个字段uid 主键,属性empid再引用empid
道光2008 2009-11-16
  • 打赏
  • 举报
回复
两表共用主键?

67,513

社区成员

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

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