java - Hibernate一对一自动添加子对象

标签 java database hibernate one-to-one

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

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("hjhjhjhj@gmail.com");
            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);
        }
    }

最佳答案

@PrimaryKeyJoinColumn 在与一对一关系关联的实体具有相同的主键值时使用。在这里你显然想使用经典外键,所以将 Address 实体中的映射更改为:

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

关于java - Hibernate一对一自动添加子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36058706/

相关文章:

mysql - 执行hibernate查询时出现异常

java - List 最多可以容纳多少数据?

java - Autowiring 在 junit 测试中不起作用

mysql - 具有多个不同标准的 UNION SELECT,其中没有真正的 FK

database - 具有许多 bool 值 "status"字段的表

ios - 对于 iOS swift 应用程序开发的 Realm 数据库,使用另一个类的成员变量数组构造一个类的理想方法是什么?

java - Hibernate:按内部列表的值过滤实体的结果列表

nhibernate - HQL:查询动态组件属性

java - 建议使用 Maven2 针对 dev/test/qa 的不同数据库和配置提出一个好方法?

java - selenium chrome 驱动程序选择证书弹出确认不起作用