你好我有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。
答案 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
。)