Java 实体副本
我不能让这个工作,我没有找到我的特殊情况的例子。简言之:我有一个主要的实体与关系。现在我想复制一个子实体,并将这个新的子实体链接到主实体。我最好试着举一个简短的例子。我跳过了getter和setter方法以使其更短: 实体条目:Java 实体副本,java,entity-framework,jpa,entity,jpa-2.0,Java,Entity Framework,Jpa,Entity,Jpa 2.0,我不能让这个工作,我没有找到我的特殊情况的例子。简言之:我有一个主要的实体与关系。现在我想复制一个子实体,并将这个新的子实体链接到主实体。我最好试着举一个简短的例子。我跳过了getter和setter方法以使其更短: 实体条目: @Entity public class Entry implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(
@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;
}
有人能帮我解决这个问题吗?您的
test的id列
。EntryData
类映射为主键,因此id列
我认为您在id列中插入了重复的值您的
测试的id列。EntryData
类映射为主键,因此id列中不允许更新
我认为您在id列中插入了重复的值,如何解决此问题?计划将主键更改为null
。通过这种方式,我认为我可以生成一个新的EntryData
实体,而不是覆盖旧的实体。将自动增量添加到该列我认为GenerationType。如果它是null
,则自动将创建一个id?我已经使用了自动增量GenerationType.AUTO
对应于MYSQLk中的AUTO increment,在mysql表中创建一个序列并修改代码,例如公共类ContactMaster实现可序列化的{@TableGenerator(name=“CONT_SEQGEN”,table=“sequence_GENERATOR”,pkColumnName=“SEQ_ID”,valueColumnName=“SEQ_ID_VAL”,pkColumnValue=“联系人ID”,allocationSize=1)@ID@GeneratedValue(策略=GenerationType.TABLE,generator=“CONT_SEQGEN”)@Column(name=“联系人ID”)public String contactId;我想要什么解决方案呢?我计划将主键更改为null
。这样我认为可以生成一个新的EntryData
实体,而不是覆盖旧实体。将自动增量添加到该列我认为GenerationType.auto
将创建如果id为null,则为id。我已经使用了auto increment…GenerationType。auto
对应于MYSQLk中的auto increment。请在mysql表中创建一个序列,并修改代码,例如,公共类ContactMaster实现可序列化的{@TableGenerator(name=“CONT SEQGEN”,table=“sequence\u GENERATOR,pkColumnName=“SEQ_ID”,valueColumnName=“SEQ_ID_VAL”,pkColumnValue=“CONTACT_ID”,allocationSize=1)@ID@GeneratedValue(strategy=GenerationType.TABLE,generator=“CONT_SEQGEN”)@Column(name=“CONTACT_ID”)public String contactId;我不是java开发人员,但在阅读文章后,我浏览了一下,看到了CascadeDetach,它分离了所有导航对象。这与您使用的框架有关吗?因为cascade类型。all
我想我已经做了一个cascade分离。我不是java开发人员,但在阅读文章后,我是浏览并看到CascadeDetach,它分离所有导航对象。这与您正在使用的框架有关吗?因为使用了CascadeType。all
我认为我已经进行了级联分离。
@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<>();
}
@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);
}
}
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.