Java JPA生成重复密钥
我有两个实体被定义为:Java JPA生成重复密钥,java,hibernate,postgresql,jpa,eclipselink,Java,Hibernate,Postgresql,Jpa,Eclipselink,我有两个实体被定义为: @Entity public class FileMaster implements java.io.Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long fileId; @NotNull @Column(unique = true) private String fileNumber = ""; private String subject = "";
@Entity
public class FileMaster implements java.io.Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long fileId;
@NotNull
@Column(unique = true)
private String fileNumber = "";
private String subject = "";
@Temporal(TemporalType.DATE)
private Date date=null;
private String authPerson="";
private String authDesign="";
private String department="";
@OneToMany(mappedBy = "fileMaster", cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name="id")
private Set<FileDetail> fileDetail = new HashSet<FileDetail>();
下面的代码只是尝试持久化这两个主详细信息表。。第一次插入进行顺利,并提交记录:
Set<FileDetail> pdfFileNames = newUpload.getPdfFileNames();
EntityManager em = Persistence.createEntityManagerFactory("fms")
.createEntityManager();
em.getTransaction().begin();
FileMaster fileMaster = new FileMaster();
fileMaster.setFileNumber((String) editorForm.getField("fileNumber").getValue());
fileMaster.setSubject((String) editorForm.getField("subject").getValue());
fileMaster.setAuthDesign((String)
editorForm.getField("authDesign").getValue());
fileMaster.setAuthPerson((String) editorForm.getField("authPerson").getValue());
fileMaster.setDate((Date) editorForm.getField("date").getValue());
fileMaster.setFileDetail(pdfFileNames);
em.persist(fileMaster);
Iterator<FileDetail> iter = pdfFileNames.iterator();
while(iter.hasNext()) {
FileDetail fileDetail = iter.next();
fileDetail.setName(fileDetail.getName());
fileDetail.setFileMaster(fileMaster);
em.persist(fileDetail);
}
em.getTransaction().commit();
em.close();
对于
FileDetail
实体,您应该使用GenerationType.IDENTITY
来生成pdfid
,而不是GenerationType.auto
@Entity
public class FileDetail implements java.io.Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pdfId;
}
GenerationType.IDENTITY
指示持久性提供程序必须为其分配主键
使用数据库标识列的实体
对于
FileDetail
实体,您应该使用GenerationType.IDENTITY
来生成pdfid
,而不是GenerationType.auto
@Entity
public class FileDetail implements java.io.Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pdfId;
}
GenerationType.IDENTITY
指示持久性提供程序必须为其分配主键
使用数据库标识列的实体
尝试在finest上设置日志记录以查看发生了什么 pdfFileNames来自哪里?这是否是现有对象,以及现有ID?如果它们存在,则应该查找/合并它们,或者使用空ID创建新的。确保在调用persist时它们没有现有ID
如果使用序列,请确保增量与分配大小匹配(默认值为50)。尝试设置登录到finest以查看发生了什么 pdfFileNames来自哪里?这是否是现有对象,以及现有ID?如果它们存在,则应该查找/合并它们,或者使用空ID创建新的。确保在调用persist时它们没有现有ID
如果使用序列也确保您的增量与分配大小匹配(默认值为50)。我的意思是我尝试过自动、标识、表格、序列……他们中没有一个对我有效。我的意思是我尝试过自动、标识、表格、序列……他们中没有一个对我有效。我如何确保他们没有现有ID。。。newUpload.GetPdfileNames()返回PdfileNames集,并且在上载新文件时,该集中的每个FileDetail对象只有一个名称被设置。我如何确保它们没有现有ID。。。getPdfFileNames()返回pdfFileNames集合,当上载新文件时,该集合中的每个FileDetail对象只有一个名称被设置。
@Entity
public class FileDetail implements java.io.Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pdfId;
}