我使用JPA
定义了以下实体bean @Entity
@Table(name = "Person", schema = "", uniqueConstraints = {
@UniqueConstraint(columnNames = {"Name", "Type"}),
@UniqueConstraint(columnNames = {"PersonID"})})
public class PersonDataBean implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Basic(optional = false)
@Column(name = "PersonID", nullable = false)
private Integer personID;
@Column(name = "Name", length = 255, nullable = false)
private String name;
@Column(name = "Type", length = 255, nullable = false)
private String type;
//getters and setters
}
我使用javax.persistence.EntityManager
个对象来访问数据库。
我已经进行了一些单元测试,以验证具有相同名称但不同类型的记录可以正确插入数据库中,并且具有相同名称和类型的记录会抛出异常,因为它在上面的代码中定义。
当我连接到mySQL数据库时,一切都按预期工作。
但是,当我在SQLite中使用具有相同单元测试的相同JPA实体对象时,可能会错误地添加具有相同名称和类型的记录。
我的第一印象是SQLite不支持多列的唯一约束。但是,我在这里阅读SQLite table constraint - unique on multiple columns这是支持的。
在初始化EntityManager期间,我可以从日志中读取表创建的以下自动生成语句
CREATE TABLE Person (PersonID INTEGER NOT NULL, Name VARCHAR(255) NOT NULL, Type VARCHAR(255) NOT NULL PRIMARY KEY (PersonID))
ALTER TABLE Person ADD CONSTRAINT UNQ_Person_0 UNIQUE (Name, Type)
为什么会发生这种情况?
答案 0 :(得分:0)
SQLite支持外键(使用正确的推荐编译指示),但不支持使用ALTER TABLE添加外键。
尝试将数据库方言设置为sqlite。在persistence.xml文件中:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name ="em1">
<jta-data-source>jdbc/MyDB</jta-data-source>
<properties>
<property name="eclipselink.target-database"
value="sqlite"/>
</properties>
</persistence-unit>
</persistence>
我怀疑eclipse链接知道sqlite。否则添加您自己的DatabasePlatform子类并添加方法
public boolean supportsForeignKeyConstraints() {
return false;
}
然后使用&#34; eclipselink.target-database&#34;属性。