2013-08-24 56 views
1

我无法得到这个工作,我发现我的特例没有例子。简而言之:我有一个与人际关系的主体。现在我想复制一个子实体并将这个新的子实体链接到主实体。最好我尝试做一个简短的例子。我跳过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. 

有人能帮助我如何解决这个问题?

+0

我不是Java开发人员,但看完后后我浏览并看到CascadeDetach分离所有的导航对象。这与你正在使用的框架有关吗? – Nilesh

+0

由于'CascadeType.ALL'我认为我已经做了级联分离。 – timmornYE

回答

1

你列test.EntryData类的id映射主键,所以更新不会在id column

让我觉得你是在id列插入重复值

+0

什么是解决方案来做我想要的?计划将主键更改为“null”。这样我就可以实现一个新的'EntryData'实体的生成,而不是旧的覆盖。 – timmornYE

+0

向该列添加自动增量 –

+0

我认为'GenerationType.AUTO'会创建一个id,如果它是'null'? – timmornYE