Java 一对多双向映射
我在hibernate项目中有以下文件: Customer.java、Request.java、Client.java和hibernate.cfg.xml如下: Customer.javaJava 一对多双向映射,java,hibernate,Java,Hibernate,我在hibernate项目中有以下文件: Customer.java、Request.java、Client.java和hibernate.cfg.xml如下: Customer.java @Entity @Table(name="customers") public class Customer { @Id @Column(name="cid") @GeneratedVal
@Entity
@Table(name="customers")
public class Customer {
@Id
@Column(name="cid")
@GeneratedValue(strategy=GenerationType.AUTO)
private int cid;
@Column(name="name")
private String name;
@Column(name="phone")
private long phone;
@OneToMany(mappedBy="customer")
private Set<Request> requests;
public Customer() {
super();
}
public Customer(String name, long phone) {
super();
this.name = name;
this.phone = phone;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getPhone() {
return phone;
}
public void setPhone(long phone) {
this.phone = phone;
}
public Set<Request> getRequests() {
return requests;
}
public void setRequests(Set<Request> requests) {
this.requests = requests;
}
@Override
public String toString() {
return "Customer [cid=" + cid + ", name=" + name + ", phone=" + phone
+"]";
}
}
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ahamdb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<mapping class="com.kar.hibernate.Customer" />
<mapping class="com.kar.hibernate.Request" />
</session-factory>
</hibernate-configuration>
它没有更新请求表中的外键列,我不明白为什么它会这样
有人能帮忙吗
我想知道我做的是否正确,如果没有,有人能给出正确的解决方案吗?这个问题与反向映射有关。如果我们声明:
@OneToMany(mappedBy=“customer”)
,即mappedBy
,我们指示Hibernate:
关系的另一端会关心持久性
而且,如果另一端(请求)知道它,它就会正确地分配客户。因此,这应该解决以下问题:
...
cust.setRequests(requests);
req1.setCustomer(cust);
req2.setCustomer(cust);
Hibernate现在有足够的信息来正确插入/更新关系
这一阅读也应有助于:
- mkyong
public class Client{
public static void main(String[] args) {
Transaction tx=null;
try
{
SessionFactory sessionFactory=AHibernateUtil.getSessionFactory();
Session session=sessionFactory.openSession();
tx=session.beginTransaction();
Customer cust=new Customer("bnuj",1111);
session.save(cust);
Request req1=new Request("4-1-14", "desc1", "active");
session.save(req1);
Request req2=new Request("4-2-14", "desc2", "unactive");
session.save(req2);
Set<Request> requests=new HashSet<Request>();
requests.add(req1);
requests.add(req2);
cust.setRequests(requests);
tx.commit();
session.close();
}
catch(Exception e)
{
e.printStackTrace();
if(tx!=null)
tx.rollback();
}
}
}
Hibernate: insert into customers (name, phone) values (?, ?)
Hibernate: insert into requests (cid, description, reqdate, status) values (?, ?, ?, ?)
Hibernate: insert into requests (cid, description, reqdate, status) values (?, ?, ?, ?)
...
cust.setRequests(requests);
req1.setCustomer(cust);
req2.setCustomer(cust);