JPA@ManyToOne不工作
在和JPA实体中保存列表时,我无法理解哪里出了问题。 我有一个超一流的人。客户端类扩展了Person。客户端类有一个电话实体列表@OneToMany(双向),代码如下所示。只要客户机实体与该电话列表保持一致,列表中的所有电话都会被保存。然而,在电话表中并没有记录客户idJPA@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
@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。将两者都设置为使您的模型与数据库保持同步,以避免出现问题。它正在工作。谢谢,克里斯。