JPA@ManyToOne不工作

JPA@ManyToOne不工作,jpa,eclipselink,many-to-one,Jpa,Eclipselink,Many To One,在和JPA实体中保存列表时,我无法理解哪里出了问题。 我有一个超一流的人。客户端类扩展了Person。客户端类有一个电话实体列表@OneToMany(双向),代码如下所示。只要客户机实体与该电话列表保持一致,列表中的所有电话都会被保存。然而,在电话表中并没有记录客户id @Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColum(name="type") public abstract class P

在和JPA实体中保存列表时,我无法理解哪里出了问题。 我有一个超一流的人。客户端类扩展了Person。客户端类有一个电话实体列表@OneToMany(双向),代码如下所示。只要客户机实体与该电话列表保持一致,列表中的所有电话都会被保存。然而,在电话表中并没有记录客户id

@Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColum(name="type")
public abstract class Person implements Serializable {

private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="PERSON_SEQ")
@SequenceGenerator(name="PERSON_SEQ",sequenceName="PERSON_SEQ", allocationSize=1,initialValue=1000) 
private Long id;

private String name;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}}
Client.class

公共类客户端扩展Person实现可序列化{

private static final long serialVersionUID = 1L;


private String foo;

@OneToMany(cascade=CascadeType.ALL,mappedBy="owner")
private List<Phone> phones;

public List<Phone> getPhones() {
    return phones;
}


public void setPhones(List<Phone> phones) {
    this.phones = phones;
}


public String getFoo() {
    return foo;
}


public void setFoo(String foo) {
    this.foo = foo;
}
/**
 * 
 */
private static final long serialVersionUID = 1L;


@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long idPhone;

private String number;

@ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="id")
private Person owner;

public Long getIdPhone() {
    return idPhone;
}

public void setIdPhone(Long idPhone) {
    this.idPhone = idPhone;
}

public String getNumber() {
    return number;
}

public void setNumber(String number) {
    this.number = number;
}

public Person getOwner() {
    return owner;
}

public void setOwner(Person owner) {
    this.owner = owner;
}
/**
 * 
 */
private static final long serialVersionUID = 1L;

@Inject
private ClientService service;

@Inject
private Client client;


@Inject 
private Employee employee;

@Inject 
private Phone phone;


public void save(ActionEvent event) {
    System.out.println(" Saving in Controller");

    try {

        client = new Client();
        employee = new Employee();
        Phone p1 = new Phone();
        p1.setNumber("99998888");
        Phone p2 = new Phone();
        p2.setNumber("88887777");
        List<Phone> phones = new ArrayList<Phone>();
        phones.add(p1);
        phones.add(p2);
        client.setName("Novembro" );
        client.setPhones(phones);
        employee.setPhones(phones);

        client.setFoo("foo value" );
        employee.setBar("bar value");

        service.saveOrUpdate(client);

        //client = new Client();
        addMessage(FacesMessage.SEVERITY_INFO, "Cliente registrado com sucesso");
    } catch (Exception e) {
        addMessage(FacesMessage.SEVERITY_ERROR, "Tente mais tarde");
        e.printStackTrace();
    }

}
}

ClientController类

@Named(value = "clientController")
@视域 公共类ClientController扩展BaseController实现可序列化{

private static final long serialVersionUID = 1L;


private String foo;

@OneToMany(cascade=CascadeType.ALL,mappedBy="owner")
private List<Phone> phones;

public List<Phone> getPhones() {
    return phones;
}


public void setPhones(List<Phone> phones) {
    this.phones = phones;
}


public String getFoo() {
    return foo;
}


public void setFoo(String foo) {
    this.foo = foo;
}
/**
 * 
 */
private static final long serialVersionUID = 1L;


@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long idPhone;

private String number;

@ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="id")
private Person owner;

public Long getIdPhone() {
    return idPhone;
}

public void setIdPhone(Long idPhone) {
    this.idPhone = idPhone;
}

public String getNumber() {
    return number;
}

public void setNumber(String number) {
    this.number = number;
}

public Person getOwner() {
    return owner;
}

public void setOwner(Person owner) {
    this.owner = owner;
}
/**
 * 
 */
private static final long serialVersionUID = 1L;

@Inject
private ClientService service;

@Inject
private Client client;


@Inject 
private Employee employee;

@Inject 
private Phone phone;


public void save(ActionEvent event) {
    System.out.println(" Saving in Controller");

    try {

        client = new Client();
        employee = new Employee();
        Phone p1 = new Phone();
        p1.setNumber("99998888");
        Phone p2 = new Phone();
        p2.setNumber("88887777");
        List<Phone> phones = new ArrayList<Phone>();
        phones.add(p1);
        phones.add(p2);
        client.setName("Novembro" );
        client.setPhones(phones);
        employee.setPhones(phones);

        client.setFoo("foo value" );
        employee.setBar("bar value");

        service.saveOrUpdate(client);

        //client = new Client();
        addMessage(FacesMessage.SEVERITY_INFO, "Cliente registrado com sucesso");
    } catch (Exception e) {
        addMessage(FacesMessage.SEVERITY_ERROR, "Tente mais tarde");
        e.printStackTrace();
    }

}
}

DAO保存方法

public T save(T entity) {
    beginTransaction();
    em.persist(entity);
    em.flush();
    commitAndCloseTransaction();
    return entity;
}
我不明白为什么它没有按预期工作。我的意思是,用拥有手机的客户的ID保存手机实体

数据库Postgresql 9.6 日食2.6.0 JPA 2.1

所有类都有@Entity和@Discrimator注释

@实体 @鉴别器值(value=“C”)

@实体
@Table(name=“PHONE”)

您已将手机添加到客户端的手机列表中,但在映射中您已声明它是“mappedby”PHONE.client映射,使其具有双向性,并指示外键由PHONE.client引用控制。在模型中将其保留为null将使外键在数据库中保留为null。将两者都设置为使您的模型与数据库保持同步,以避免出现问题。它正在工作。谢谢,克里斯。