i have an entity with a unique name.

In my example i save two persons with the same name. At the second time comes an "EntityExists" (Unique) Exception, that was the expected behavior.

After it i changed name and set the "ID" to null. Than i try to persist it again but i get "org.apache.openjpa.persistence.EntityExistsException: Attempt to persist detached object "com.Person@1117a20". If this is a new instance, make sure any version and/or auto-generated primary key fields are null/default when persisting.
without the version it works but i find no solution to "reset" the version number.

Can someone help me?

Update: My new problem is, that i have a base entity an two pcVersionInit (look at my answer at bottom) i can't override it, i tried it in base and normal entity what is the best practise now instead of "override" the value in pcVersionInit ? Copy Constructor?"

public class Starter{
private static EntityManager em;

public static void main(String[] args) {
    em = Persistence.createEntityManagerFactory("openjpa")
            .createEntityManager();
    Person p1 = new Person("TEST");
    savePerson(p1);
    Person p2 = null;
    try{
        p2 = new Person("TEST");
        savePerson(p2);
    }catch(Exception e){
        p2.setId(null);
        p2.setName(p2.getName()+"2");
        em.persist(p2);
    }

}


private static void savePerson(Person person){
    em.getTransaction().begin();
    em.persist(person); 
    em.getTransaction().commit();   
}
}

Person.class:

@Entity
public class Person implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="seqGenerator")
@SequenceGenerator(name="seqGenerator",sequenceName="personSeq")
private Long id;

@Version
private Long version;

@Column(nullable=true, unique=true)
private String name;

public Person(String name) {
    this.name = 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;
}

public Long getVersion() {
    return version;
}

public void setVersion(Long version) {
    this.version = version;
}    
}
有帮助吗?

解决方案

First off, stay away from messing around with pcVersionInit. I'd suggest to create a copy constructor in your Person Entity and in the event of rollback create a new one using the copy constructor.

其他提示

Okay the problem is that OpenJPA adds a field named pcVersionInit (with @version) and set it "true" after try to persist. If i use reflection to set it to false, it works. Other way is a copy constructor.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top