Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复的键值JPA_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 重复的键值JPA

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”中插入

我已经在SpringMVC+JPA+SQLServer上构建了一个小应用程序。出于某些原因,我不得不在我的应用程序中进行一些实体更改,并且我不得不手动将一些数据从旧数据库迁移到新数据库(模式稍有不同)。迁移完所有数据后,我发现以下错误:

13:47:26.191[http-nio-8080-exec-1]错误o.h.e.jdbc.spi.SqlExceptionHelper-违反主键约束“PK_ugljourna_uu3213e83f741bd595”。无法在对象“dbo.GLEntry”中插入重复键。重复的键值为(34903)

这是我的实体:

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