实体重复

时间:2013-08-24 07:55:09

标签: java entity-framework jpa entity jpa-2.0

我无法完成这项工作,我找不到我的特例。简而言之:我有一个关系的主要实体。现在我想制作一个子实体的副本,并将这个新的子实体链接到主实体。我尽力做一个简短的例子。我跳过getter和setter方法来缩短它:

实体条目:

@Entity
public class Entry implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "entry", cascade=CascadeType.ALL)
    private List<EntryData> entriesDataList = new LinkedList<>();

    @OneToOne(cascade=CascadeType.ALL)
    private EntryData entryData;

}

实体EntryData:

@Entity
public class EntryData implements Serializable{

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String subject;

    @ManyToOne(optional = false)
    private Entry entry;    

    @ManyToMany(mappedBy = "entries", cascade = {CascadeType.ALL} )
    private List<EntryTag> tags = new LinkedList<>();

}

实体EntryTag:

@Entity
public class EntryTag  implements Serializable{

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique=true)
    private String name;

    @ManyToMany() 
    private List<EntryData> entries = new LinkedList<>();        

}

现在我要执行以下操作:

@Stateless
public class NewEntryData {

    @PersistenceContext
    private EntityManager em;

    public void makeNewEntryData(){
        Entry e = em.find(Entry.class, 10);
        em.detach(e);
        EntryData ed = e.getEntryData();
        ed.setSubject("New Subject");
        ed.setId(null);
        for (Iterator<EntryTag> it = ed.getTags().iterator(); it.hasNext();) {
            it.next().addEntryData(ed);            
        }
        em.merge(e);
    }   
}

我的期望:

生成新实体EntryData,其内容与存储在Entry.entryData中的旧实体相同,但新主题除外。在Entry.entryData中生成了指向新EntryData的链接。旧的EntryData按原样包含在数据库中。

我在em.merge(e)得到的信息:

org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [test.EntryData] is mapped to a primary key column in the database. Updates are not allowed.

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

id类的列test.EntryData被映射为主键,因此id column

中不允许更新

我认为您在id列中插入重复值