我是hibernate的新手。
我有两个类UserDetails和Address。这两个类是一对多的关系。详情如下(Skiping getter and setters)
UserDetails.java
@Entity
@Table(name = "UserDetails")
public class UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId")
private int userId;
@Column(name = "UserName")
private String userName;
@OneToMany
@JoinColumn(name = "address")
private Collection<Address> address = new ArrayList<Address>();
}
Address.java
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "city")
private String city;
}
App.java
UserDetails ud=new UserDetails();
ud.setUserName("User 1");
Address ad1=new Address();
ad1.setCity("Mumbai");
Address ad2=new Address();
ad1.setCity("Pune");
ud.getAddress().add(ad1);
ud.getAddress().add(ad2);
Session session=factory.openSession();
session.beginTransaction();
session.save(ud);
session.save(ad1);
session.save(ad2);
session.getTransaction().commit();
session.close();
在hibernate.cfg.xml属性中,name =“hbm2ddl.auto”设置为更新 运行上面的代码之后,数据库中的条目是
UserDetails表
userId UserName Address
1 User 1 NULL
地址表
Id City Address
1 Pune 1
2 NULL 1
我的问题是为什么hibernate在地址表中插入UserDetails Address = NULL和City = NULL而不是创建新表。
答案 0 :(得分:1)
Address ad2=new Address();
ad1.setCity("Pune");
您正在将城市pune
设置为address1
,而不是address2
尝试将其更改为
Address ad2=new Address();
ad2.setCity("Pune");
<强>更新强>
您的用户表adrees列为null,因为您的pojo中没有映射字段用于地址无论如何您的数据库架构设计方式是错误的实现onetomany关系。请在这里One to Many Hibernate查看正确的方法
答案 1 :(得分:0)
<强>第一强>
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "userId")
private int userId;
UserDetails表
Id UserName Address 1 User 1 NULL
标识列的两个冲突列名称不同,应该是userId而不是id。在java文件或数据库中更正。
第二次
Address ad2=new Address();
ad1.setCity("Pune");
这将设置ad1的城市而不是ad2。但是,在对城市列进行空检查之前,这不会有任何影响。