Sqlite JPA主键错误

时间:2015-06-17 15:19:07

标签: java sqlite jpa

你好我有Sqlite和JPA的问题。 我在Sqlite中有下表:

Section:
secID INTEGER Primary Key
secname TEXT

如果我在Sqlite中使用主键,当我插入类似

的值时,此值将自动更新
INSERT INTO Section(secname) VALUES("Default");

在我的Java Classes中,我有以下Class" Section":

@Entity
@Table(name="\"Section\"")
public class Section implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="\"secID\"")
    private int secID;

    @Column(name="\"secname\"")
    private String secname;
    + Getter and Setter
}

该表默认有两个值。 如果我尝试使用jpa在表中插入一个新值,如:

Section sec = new Section();
sec.setSecname("Test2");
tx.begin();
    em.persist(sec);
tx.commit();

它将插入secID = 0.如果我然后尝试插入一个新的值我将成为一个错误,因为此时secID = 1并且这个secID已经存在于表中,因为已经存在两个值表(它们有secID = 1和secID = 2)。

如何使用JPA避免此问题?我使用EclipseLink。

2 个答案:

答案 0 :(得分:0)

在您的ID映射中添加@GeneratedValue(strategy = GenerationType.IDENTITY)应该这样做。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="\"secID\"")
private int secID;

答案 1 :(得分:0)

我不认为你的第二个插入与表中已经存在的两个值(secID = 1和2)发生冲突;我认为它与您刚刚插入的值相撞(secID = 0)。

你没有明确地在任何地方设置secID,这意味着它是0.所以它一遍又一遍地插入0。

将班级中的secID字段更改为Integer,而不是int,并且其行为应为the SQLite docs suggest,其中,当您尝试插入时对于INTEGER PRIMARY KEY列中的NULL,该列实际上将填充一个大于表中已有的最大键的整数。“ (同样,现在你插入0,而不是null。)