读书人

Hibernate 一对多Integer 的 ID 为啥

发布时间: 2013-07-04 11:45:33 作者: rapoo

Hibernate 一对多,Integer 的 ID 为什么总是错
如题,正在研究一对多映射,但是不管我怎么设置他们的ID,都是1,而不是我所设置的值。

代码如下


@Entity
@Table(name = "t_group")
public class Group {
private Integer id;
private String name;
private Set<User> users = new HashSet<User>();

// 在主键的get方法前
// 标注主键,以及生成主键策略
// 相当于<id name="id"><generator class="native"></generator></id>
@Id
@GeneratedValue
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

// 在一般属性的get方法前
// 一般的列名前不需要标注
// 相当于<property name="name"></property>
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

// 在一对多"一"的一方关联的集合前
// 使用@OneToMany标注,并标明"mappedBy",即关联的"多"的一方所对应的类的属性
// cascade参数标明级联的方式,如果不需要级联可以省略
// 相当于<set name="users">
// <key column="groupId"></key>
// <one-to-many class="com.pegasus.domain.User"/>
// </set>
@OneToMany(mappedBy = "group", cascade = { CascadeType.ALL })
public Set<User> getUsers() {
return users;
}

public void setUsers(Set<User> users) {
this.users = users;
}
}



import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
//在实体类的类名前
//标注是实体
//对应的表名
//相当于xml的
//<class name="com.pegasus.domain.User" table="t_user"></class>
@Entity
@Table(name="t_user")
public class User {
private Integer id;
private String name;
private Group group;

//在主键的get方法前
//标注主键,以及生成主键策略
//相当于<id name="id"><generator class="native"></generator></id>
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}

//在一般属性的get方法前
//一般的列名前不需要标注
//相当于<property name="name"></property>
public String getName() {
return name;


}
public void setName(String name) {
this.name = name;
}
//在一对多"多"的一方关联的属性get方法前
//使用@ManyToOne标注
//cascade参数标明级联的方式,如果不需要级联可以省略
//相当于<many-to-one name="group" column="groupId"></many-to-one>
@ManyToOne(cascade={CascadeType.ALL})
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}




public class HibernateORMappingTest {
private static SessionFactory sessionFactory;


public static void beforeClass() {
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}

public static void afterClass() {
sessionFactory.close();
}


public static void main(String[] args) {

Configuration cfg = new Configuration();
SessionFactory sf = cfg.configure("hibernate2.cfg.xml").buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();

User u = new User();
u.setName("u1");
Group g = new Group();
g.setName("g1");
g.setId(new Integer(10));
u.setGroup(g);
u.setId(new Integer(22));

System.out.println(g.getId());

session.save(g);
session.save(u);


session.getTransaction().commit();
session.close();
sf.close();

}
}
Hibernate
[解决办法]
使用@GeneratedValue注解的值不需要设置,是自动生成的,去掉@GeneratedValue注解

读书人网 >Java Web开发

热点推荐