为什么JPA声明的唯一多个约束在mySQL中有效但在SQLite中无效

时间:2015-03-31 20:16:19

标签: java mysql sqlite jpa

我使用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)

为什么会发生这种情况?

1 个答案:

答案 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;属性。