Java 重复的键值JPA
我已经在SpringMVC+JPA+SQLServer上构建了一个小应用程序。出于某些原因,我不得不在我的应用程序中进行一些实体更改,并且我不得不手动将一些数据从旧数据库迁移到新数据库(模式稍有不同)。迁移完所有数据后,我发现以下错误: 13:47:26.191[http-nio-8080-exec-1]错误o.h.e.jdbc.spi.SqlExceptionHelper-违反主键约束“PK_ugljourna_uu3213e83f741bd595”。无法在对象“dbo.GLEntry”中插入重复键。重复的键值为(34903) 这是我的实体:Java 重复的键值JPA,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我已经在SpringMVC+JPA+SQLServer上构建了一个小应用程序。出于某些原因,我不得不在我的应用程序中进行一些实体更改,并且我不得不手动将一些数据从旧数据库迁移到新数据库(模式稍有不同)。迁移完所有数据后,我发现以下错误: 13:47:26.191[http-nio-8080-exec-1]错误o.h.e.jdbc.spi.SqlExceptionHelper-违反主键约束“PK_ugljourna_uu3213e83f741bd595”。无法在对象“dbo.GLEntry”中插入
@Entity
public class GLJournalEntry {
@Id @GeneratedValue
private Long id;
private BigDecimal amount;
private Date creationDate;
@OneToOne
@JoinColumn(name = "glAccount_id", nullable = false)
private GLAccount glAccount;
private String notes;
@Enumerated(EnumType.STRING)
private ProductType productTyep;
private Date entryDate;
@Column(nullable = false)
private long transactionID;
@Enumerated(EnumType.STRING)
private EntryType type;
}
我猜我收到这个错误消息是因为默认的ID注释@ID@GeneratedValue
我怎样才能修好它?我如何才能以自动从数据库获取最新ID的方式生成ID?您可以使用数据库的序列功能获取唯一ID,该ID将始终是新的和最新的ID
使用链接获取更多信息在数据库中尝试类似的方法
CREATE SEQUENCE "ABC"."MY_SEQ" MINVALUE 0 MAXVALUE 2147483647 INCREMENT BY 1 START WITH 9130 CACHE 50 ORDER NOCYCLE ;
您可以使用自定义逻辑从DB获取最新的Id。请举例说明我为解决问题所做的工作。它与Hibernate一起工作-
@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="GeneratedId")
@GenericGenerator(name="GeneratedId",
strategy="....GenerateId"
)
@Column(name = "ID", nullable = false)
private Integer id;
及
解决我的问题最简单的方法是将注释更改为实体 更改自:
@Id@GeneratedValue
致:
@Id@GeneratedValue(strategy=GenerationType.AUTO)
我应该怎么做?我使用了:'@Id@SequenceGenerator(name=“Id\u generator”,sequenceName=“SEQUENCE\u name”,allocationSize=1)@GeneratedValue(generator=“Id\u generator”,strategy=GenerationType.SEQUENCE)”,但结果相同,请参考链接,希望它能解决您的问题。
import org.hibernate.id.IdentityGenerator;
...
public class GenerateId extends IdentityGenerator {
private static final Logger log = Logger.getLogger(GenerateId.class.getName());
@Override
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
String prefix = "M";
Connection connection = session.connection();
try {
PreparedStatement ps = connection
.prepareStatement("SELECT nextval ('seq_stock_code') as nextval");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
int id = rs.getInt("nextval");
String code = prefix + StringUtils.leftPad("" + id,3, '0');
log.debug("Generated Stock Code: " + code);
return code;
}
} catch (SQLException e) {
log.error(e);
throw new HibernateException(
"Unable to generate Stock Code Sequence");
}
return null;
}