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;
}