Hibernate 级联保存失败,Hibernate defect

使用annotation方式标注Payment和PaymentEntry. ID都是用自己设定策略assigned。

@Entity
@Table(name = "LO_CONF_PAYMENT")
public class PaymentBillDO implements Serializable{


@Transient
private static final long serialVersionUID = 206001219164196538L;


@Id
@Column(name = "ID", length = 50)
@GeneratedValue(generator = "c-assigned")
@GenericGenerator(name = "c-assigned", strategy = "assigned")
private String ID;

@OneToMany(mappedBy ="parent",
targetEntity = PaymentBillEntryDO.class, fetch = FetchType.LAZY)
@Cascade({ CascadeType.ALL})
private List<PaymentBillEntryDO> Entries;
}



@Entity
@Table(name = "LO_CONF_PAYMENTENTRY")
public class PaymentBillEntryDO implements Serializable {

private static final long serialVersionUID = 6913338048891980882L;

@Id
@Column(name = "ID", length = 50)
@GeneratedValue(generator = "c-assigned")
@GenericGenerator(name = "c-assigned", strategy = "assigned")
private Long ID;

@ManyToOne( targetEntity = PaymentBillDO.class, fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID", nullable = false)
@Cascade({ CascadeType.REFRESH })
private PaymentBillDO parent;


无论怎么测试,都不能级联保存。
搜索了无数网页,中文的,英文都,都没有解。搜到过一点点有用的资料,就是把@Cascade有JPA的annotaion换成Hibernate的annotaion。其他的各种sample都只是对hibernate reference的抄袭而已。
于是只能debug hibernate。在类DelegatingStatement的executeBatch方法中居然发现了对entry的cascade update语句,而不是想象中的Insert语句。想了一下,难道hibernate如果发现entry 有ID的话,就判断对entry进行级联update,而不是进行insert。 后来把ID生成策略换成了SEQUENCE,解决问题。

崩溃啊。
新的Entry的annotation为


@Entity
@Table(name = "LO_CONF_PAYMENTENTRY")
public class PaymentBillEntryDO implements Serializable {

private static final long serialVersionUID = 6913338048891980882L;

@Id
@Column(name = "ID", length = 50)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "paymentbillEntry_seq")
@SequenceGenerator(name = "paymentbillEntry_seq", sequenceName = "SEQ_LO_CONF_PAYMENT_ENTRY")
private Long ID;

@ManyToOne( targetEntity = ElementEventRelationshipDO.class, fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID", nullable = false)
@Cascade({ CascadeType.REFRESH })
private PaymentBillDO parent;


希望大家出现这个问题的时候,搜到的答案不仅仅是copy reference而已。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值