jpa创建新实体,同时删除具有相同唯一键的旧实体

时间:2015-01-08 18:03:08

标签: java jpa eclipselink

我有实体zika1

public class zika1 {
@Id
int id;
String sika;
@OneToMany(cascade=CascadeType.ALL,orphanRemoval=true)
@JoinColumn
List<zika2> zikas=new ArrayList<zika2>();}

和实体zika2

@Table(name = "zika2", uniqueConstraints = @UniqueConstraint(columnNames = { "b" }))

public class zika2 {

@Id
String a;
@Column(unique=true)
String b;}

和这个方法:

    public void testuniqu()
{

        zika1 zik=super.find(1);

        zika2 zik22=new zika2();

        zik22.setA("karkar");
            zik22.setB(zik.getZikas().get(0).getB());
            zik.getZikas().remove(0);
            zik.getZikas().add(zik22);
            super.save(zik);        
    }

这会抛出一个唯一的约束异常,但实际上我正在删除第一个实体。所以jpa(eclipse链接)没有在同一个db事务中运行此操作。 有没有办法告诉jpa在新zika2实体的插入操作之前运行删除?

1 个答案:

答案 0 :(得分:2)

我认为这是一个正常的流程,因为EclipseLink不会按顺序执行命令。所以你需要告诉EclipseLink一些提示,“删除”操作应该是第一个。根据 : http://wiki.eclipse.org/Using_Advanced_Unit_of_Work_API_%28ELUG%29#How_to_Use_the_setShouldPerformDeletesFirst_Method_of_the_Unit_of_Work,您应该使用 setShouldPerformDeleteFirst