2016-03-17 32 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