【问题标题】:Hibernate List Mapping AnnotationHibernate 列表映射注解
【发布时间】:2014-04-28 06:38:13
【问题描述】:

我有这个问题

这是我的桌子

这是我的“Compra”代码

@Entity
@Table(name = "compra")
public class Compra implements Serializable {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "codigo", unique = true, nullable = false)
     private int codigo;

     @ManyToOne
     @JoinColumn(name = "codProveedor", nullable = false)
     private Proveedor proveedor;

     @Column(name = "tipoComprobante", nullable = false)
     private String tipoComprobante;

     @Temporal(TemporalType.DATE)
     @Column(name = "fechaFactura", nullable = false)
     private Date fechaFactura;

     @Temporal(TemporalType.DATE)
     @Column(name = "fechaLlegada", nullable = false)
     private Date fechaLlegada;

     @Column(name = "serie", nullable = false)
     private String serie;

     @Column(name = "numero", nullable = false)
     private int numero;

     @Column(name = "importe", nullable = false)
     private double importe;

     @Column(name = "vigencia", nullable = false)
     private boolean vigencia = true;

     @ElementCollection    
     private List<DetalleCompra> lstDetalle = new ArrayList<DetalleCompra>();
    // getters and setters ...

这是我的“DetelleCompra”代码

@Entity
@Table(name = "detalleCompra")
public class DetalleCompra implements Serializable {

    @Id
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign", parameters =       @Parameter(name  = "property", value = "compra"))
    @Column(name = "codCompra", nullable = false)      
    private int codCompra;

    @ManyToOne
    @JoinColumn(name = "codPresentacion", nullable = false)
    private Presentacion presentacion;

    @Column(name = "imei", nullable = false)
    private String imei;

    @Column(name = "simcard", nullable = false)
    private String simcard;
    getters and setters ...

一切看起来都很好,但是当我想保存时,我遇到了这个问题

org.hibernate.TransientObjectException: 对象引用了一个未保存的瞬态实例——在刷新之前保存瞬态实例:DetalleCompra

这很清楚,因为当我想保存 Compra 和 DetalleCompra 时,第二个表需要 fk 值

  public void registrar(Compra compra) {
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        trans = session.beginTransaction();                      
        session.save(compra);
        trans.commit();
    } catch (Exception e) {
        trans.rollback();
        throw e;
    } finally {
        session.close();
    }
}

好吧,“compra”表的 pk 生成得很好,但是其他表无法识别自动生成的这个值,为什么?,我该如何解决?

【问题讨论】:

  • 为什么是“@ElementCollection”而不是“@OneToMany”
  • 当我把 onetomany 说成同样的“org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:DetalleCompra”

标签: java hibernate jpa jpa-2.0 hibernate-annotations


【解决方案1】:

@ElementCollection

定义基本类型或可嵌入类的实例集合。 如果要通过 a 映射集合,则必须指定 收集表。

您使用错误的注释来表示关系。 Compra 和 DetalleCompra 之间存在一对多关系。

您应该将@ElementCollection 注释更改为@OneToMany。不要忘记指定连接列@JoinColumn(name="codCompra")。我假设Presentacion 已正确映射。

另请参阅

Unidirectional Mapping vs. Bidirectional Mapping

mappedBy attribute

@OneToMany annotation

@ElementCollection annotation

【讨论】:

  • 是的,我知道,谢谢,但当我放 OneToMany 时,它又说了一遍:org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:DetalleCompra
  • 在@OneToMany之后使用@JoinColumn(name="codCompra")
  • 它说的一样,我认为@OneToMany(cascade = CascadeType.ALL) 会有所帮助,但是当我输入时出现空错误
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2014-01-22
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多