2016-03-17 27 views
3

我想在数据库中使用休眠一对一关系自动添加子对象。使用下面的代码它不在地址表中添加外键。休眠一对一自动添加子对象

public class Address implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Column(name = "address") 
    private String address; 
    @OneToOne(cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn(name = "p_id", referencedColumnName = "id") 
    private Person pId; 

    Getters And Setters 
} 

public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Column(name = "birthdate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date birthdate; 
    @Column(name = "email") 
    private String email; 
    @Column(name = "mobile") 
    private BigInteger mobile; 
    @Column(name = "name") 
    private String name; 
    @OneToOne(mappedBy = "pId", cascade = CascadeType.ALL) 
    private Address address; 

    Getters And Setters 
} 

这里的主要方法

public static void main(String[] args) 
    { 
     try 
     { 
      Configuration configuration = new Configuration().configure(HibernateUtil.class.getResource("/hibernate.cfg.xml")); 
      StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder(); 
      serviceRegistryBuilder.applySettings(configuration.getProperties()); 
      ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); 
      SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
      Session session = sessionFactory.openSession(); 
      Transaction transaction = session.beginTransaction(); 
      Person person = new Person(); 
      person.setBirthdate(new Date()); 
      person.setEmail("[email protected]"); 
      person.setMobile(new BigInteger("44444444")); 
      person.setName("kjkljkljkj"); 
      Address address = new Address(); 
      address.setAddress("jkhkjhkj"); 
      address.setPId(person); 
      person.setAddress(address); 
      session.save(person); 
//   session.save(address); 
      transaction.commit(); 
      session.flush(); 
      session.close(); 
      System.out.println("Success..."); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(System.out); 
     } 
    } 

回答

0

@PrimaryKeyJoinColumn当与一对一的关系相关联的实体具有相同的主键值被使用。在这里,你显然希望用经典的外键,所以在Address实体改变映射到:

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "p_id") 
private Person pId; 
+0

完美。谢谢。 – KSHiTiJ