Many-to-one 单向关联。
User 和cards的一对多,cards id主键,自增长,属性uid引用user id作为外键。cards实体可以访问User实体集,但是反之不行(单向)。
Cards.hbm.xml
<class name="org.hibernate.tutorial.domain.Cards"table="cards">
<id name="cid" type="java.lang.Integer"column="cid">
<generator class="native"/>
</id>
<property name="info" type="java.lang.String"column="info"/>
<many-to-one name="user" column="uid"/>
</class>
Card.java
publicclassCards implements Serializable {
privateInteger cid;
privateString info;
privateUser user;
User.hbm.xml
<class name="org.hibernate.tutorial.domain.User"table="user">
<id name="id"type="java.lang.Integer" column="id">
<generator class="native" />
<property name="name" type="java.lang.String"column="name" />
<property name="age" type="java.lang.Integer"column="age" />
</class>
User.java
publicclassUser implements Serializable {
privateInteger id;
privateString name;
private Integer age;
测试
// 读取hibernate.cfg.xml文件
Configurationcfg= newConfiguration().configure();
// 建立SessionFactory
SessionFactoryfactory= cfg.buildSessionFactory();
// 取得session
Sessionsession= null;
try {
session = factory.openSession();
// 开启事务
session.beginTransaction();
Useruser= (User) session.load(User.class, new Integer(46));
Cardscard= newCards();
card.setInfo("acard");
card.setUser(user);
System.err.println("card uid:"+card.getUser().getId());
session.save(card);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
// 回滚事务
session.getTransaction().rollback();
}finally{
if (session != null) {
if (session.isOpen()) {
// 关闭session
session.close();
}
}
}
}
在多的一方(Cards)配置many-to-one。但是将many-to-one中配置unique属性,貌似没什么作用。然后查了一下many-to-one的参数表
unique:允许产生外键列唯一约束的数据库定义语言(DDL)(可选)
大概是通过hibernate配置创建数据库时,通过unique添加外键唯一约束。也就是如果数据库没有添加外键唯一约束,而且hibernate配置有没有开启hibernate.hbm2ddl.auto,则unique是没有用的。
当在数据库中创建了针对外键的唯一约束:
这时候插入相同外键的数据记录会报错:例如Duplicate entry '1' for key 'uid'