java - 将 Set 插入到 JPA 中

标签 java jpa

我正在使用 JPA 制作数据库。我定义了类,现在我正在插入数据。这是我的 table :

public class Cliente {
@Id
@Column(name = "DNI", nullable = false, length = 10)
private String DNI;
@Column(name= "Nombre", nullable = false, length= 20)
private String nombre;
@Column(name= "Apellidos", nullable = false,length= 50)
private String apellidos;
@Column(name= "FechaNac" , nullable = false)
private Date FechaNac; //uso Date de SQL ya que es para una base de datos.
@Column(name= "Direccion" , nullable = false, length = 40)
private String direccion;
@Column(name = "email" , nullable= true, length=50)
private String email;
@Column(name = "Telefono" , nullable=false,length=15)
private String telefono;

@ManyToMany(cascade ={CascadeType.ALL})
@JoinTable(name="es_titular",joinColumns=@JoinColumn(name="DNI"),inverseJoinColumns=@JoinColumn(name="numerocuenta"))
private Set<Cuenta> cuentas;
public Cliente(){}

public Set<Cuenta> getCuentas(){
    return cuentas;
}

public void setCuentas(Set<Cuenta> a){
    cuentas=a;
}
}

和另一个表:

package Entidades;

import java.sql.Date;
import java.util.Set;

import javax.persistence.*;

@Entity(name="Cuenta")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(
    name="discriminator",
    discriminatorType=DiscriminatorType.STRING)

 //Si es especializacion total, no se pone.
//@DiscriminatorValue("D")
public class Cuenta {
@Id
@Column(name="numerocuenta", nullable=false, length=15)
private String numerocuenta;
@Column(name="FechaCreacion", nullable=false)
private Date FechaCreacion;
@Column(name="Saldo", nullable=false, precision=2)
private float Saldo;
@ManyToMany(mappedBy ="cuentas")
private Set<Cliente> clientes;
@OneToMany(cascade=CascadeType.REMOVE, mappedBy="cuenta")
private Set<Operacion> operaciones;

@OneToMany(cascade=CascadeType.REMOVE, mappedBy="cuentaObjetivo")
private Set<Transferencia> transferencias;

public Set<Cliente> getClientes(){
    return clientes;
}
public void setClientes(Set<Cliente> s){
    clientes=s;
}
public Set<Operacion> getOperaciones(){
    return operaciones;
}

public void setOperaciones(Set<Operacion> s){
    operaciones=s;
}


public Set<Transferencia> getTransferencias(){
    return transferencias;
}

public void setTransfrencias(Set<Transferencia> s){
    transferencias=s;
}
}

我删除了一些属性以使代码更加干净。

然后,当我插入 Cuentas 时,我会这样做:

Set<Cliente> clientes=new HashSet<Cliente>();
    clientes.add(cliente1);
    clientes.add(cliente2);

    trans.begin();

    Cuenta cuenta = new Cuenta();
    cuenta.setNumerocuenta("343434");
    cuenta.setFechaCreacion(new Date(2013,05,05));
    cuenta.setSaldo(0);
    cuenta.setClientes(clientes);
    em.persist(cuenta);
    trans.commit();

创建了 Cliente 和 Cuenta。但是当我查看数据库时,我在任何表中都没有看到 Set Clientes。

你知道我做错了什么吗?

编辑:我的目标是当我在可连接的 es_titular 中的任何表(Cliente 或 Cuenta)中插入 Set 时,就会出现。 es_titular的结构为:DNI varchar2(10 char)、numerocuenta varchar2(15 char)

最佳答案

您有双向关联。每个双向关联都有一个所有者方和一个反向方。反面是带有 mappedBy 属性的一面。业主方是另一方。 JPA 不关心反面。

所以如果你想将一个cliente与一个cuenta关联起来,你必须将cuenta添加到cliente中,因为cuente是关联的所有者端。一般来说,好的做法是维护关联双方,即使 JPA 只关心所有者一方,因为

  • 你一定不会忘记主人的一面
  • 它使对象图连贯

关于java - 将 Set 插入到 JPA 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16427479/

相关文章:

java - 如何设置默认数据库值

jpa - @Enumerated(EnumType.STRING) 导致没有为值 [0] 提供转换值

java - YAML Jackson - 映射 Integer 属性时出现 NullPointerException

java - 将带有图像的 JLabel 添加到 JList 以显示所有图像

java - 使用循环用数组填充键时 HashMap 键重新调整为 null

java - 没有交易的 JPA 更新查询 - 交易是强制性的吗?

java - JPA 与 DTO 和乐观锁定合并到 RESTful Web 应用程序中?

java - 带有字符串的 JPQL LIKE 语法

java - 将Java类显示到jsp网页中

java - Play Framework 2.2 : How to get current controller and action in java