如何将@UniqueConstraint 与单表继承(JPA)一起使用?

Posted

技术标签:

【中文标题】如何将@UniqueConstraint 与单表继承(JPA)一起使用?【英文标题】:How to use @UniqueConstraint with single table inheritance (JPA)? 【发布时间】:2015-01-02 10:49:26 【问题描述】:

我有一个使用单表策略扩展现有实体的类(我无法更改)。 我想对该实体使用 UniqueConstraint,所以我尝试了:

@Entity
@Table(name = "t_document")
public class Document implements Serializable 
...

@Entity
@Table(uniqueConstraints =  @UniqueConstraint(name = "Test", columnNames =  ...  ) )
public class MyDocument extends Document 
...

根本没有使用唯一约束,日志文件中没有任何内容。 这是在这种情况下使用 UniqueConstraints 的正确方法吗?

(我们使用 JPA2,JBoss 7.1)

【问题讨论】:

你如何生成你的类? @UniqueConstraint 只适用于表的生成, 表是通过 Hibernate / JPA create 创建的。表创建正确,只是缺少约束。 【参考方案1】:

您不能覆盖基类 @Table 声明,这就是忽略子类 uniqueConstraints 指令的原因。

使用 JPA,您可以override annotations with xml declarations。所以你需要在你的 class-pat 中添加一个 orm.xml 文件并在那里添加唯一约束:

<entity-mappings 
  xmlns="http://java.sun.com/xml/ns/persistence/orm"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
  version="2.0">

    <package>...</package>
    <entity class="Document" access="PROPERTY" metadata-complete="false">
        <table name="document">
            <unique-constraint>
                <column-name>first_column</column-name>
                <column-name>second_column</column-name>
            </unique-constraint>
        </table>            
</entity-mappings>

如果您只使用 MyDocument 子类来覆盖 DDL 架构,那么您甚至可能不需要它。

【讨论】:

以上是关于如何将@UniqueConstraint 与单表继承(JPA)一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Django 基础 之ORM简介与单表操作

SQL 连接与单表:性能差异?

Rails ActiveRecord_Associations_CollectionProxy 与单表继承

mysql 的完整性约束 与单表查询

DMLDQL与单表多表的增删改查(20190215下午)

MySQL 多表where查询与单表select where in哪一个效率高