JPA

表关系:
create table address(
 id int primary key auto_increment,
 address_name char(100)
);
create table person(
 id int primary key auto_increment,
 name char(100),
address_id int);一对一
实体:
@Entity
@Table(name = "address")
public class Address { @Id
@Column(name = "id")
private int id; @Column(name = "address_name")
private String addressName;@Entity
@Table(name = "person")
public class Person { @Id
@Column(name = "id")
private int id; @Column(name = "name")
private String name; @OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="address_id")
private Address address;test:
EntityManagerFactory emFactory = null; emFactory = Persistence.createEntityManagerFactory("jpa02");
EntityManager em = emFactory.createEntityManager();
Address a = new Address();
Person p = new Person();
p.setName("lxy");
p.setAddress(a);
a.setAddressName("hangzhou........");
em.getTransaction().begin();
// 执行添加操作
em.persist(p);
// em.persist(a); em.getTransaction().commit();
// 关闭事务
em.close();
// 关闭工厂
emFactory.close();怎么在保存的时候 person表中的address_id字段始终为0,并没有参照address的id字段。。为什么呀??
求解决。。

解决方案 »

  1.   

    关系的维护应该通过主表来完成吧?楼主有没有试过将OneToOne的关系写在Address,然后em.persist(a);
      

  2.   

    现在是person参照address啊,,应该是在person中有一个address的属性才对呀
      

  3.   

    我一直是这样的写法User类,主表
    @OneToOne(targetEntity=UserDeploy.class, mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private UserDeploy userDeploy;UserDeploy类,从表
    @OneToOne
    @JoinColumn(name="user_id")
    private User user;
      

  4.   

    如果通过从表来维护你想也能想来为什么是0了,因为save的时候永远是先保存当前方法中传入的对象,这个时候主表压根就没有插入数据,哪来的id
      

  5.   

    这时双向关联的吧 还是不行。。难道是我的实现类有问题。。我用的eclipselink-2.2.0.jar
      

  6.   

    em.getTransaction().begin();
    // 执行添加操作
    em.persist(a);
    em.persist(p);
    em.getTransaction().commit();
      

  7.   

    那就不清楚了,至少我这种在hibernate,jboss5(用的也是hibernate),以及weblogic10(openJPA上)都没有问题