带有扩展的@UniqueConstraint 的问题

时间:2021-04-18 01:26:34

标签: java jpa annotations

主类

CREATE TABLE TestTable 
(
     ID Int, 
     City Varchar(100), 
     CreateDate Datetime, 
     UpdateDate Datetime
);

ALTER TABLE TestTable 
    ADD CONSTRAINT [Constraint_CreateDate] DEFAULT (GETDATE()) FOR [CreateDate];

INSERT INTO TestTable (ID, City) 
VALUES (1, 'DC');

UPDATE TestTable 
SET City = 'NY' 
WHERE ID = 1; -- How to populate the UpdateDate when this update happen.

类扩展

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"codigoEAN", "tipo"})})
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo")
@DiscriminatorValue("Produto")
public class Produto {

我想要什么?

  1. 当产品类型为“Produto”时,它不会重复键(codigoEAN、tipo),但当它是“Caixa”类型时,它可以重复键。

类似的东西

@Entity
@DiscriminatorValue("Caixa")
public class ProdutosEmCaixa extends Produto {

有人遇到过这种情况吗?

1 个答案:

答案 0 :(得分:0)

问题是你正在使用

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

这意味着两个实体都将映射到一个表中(使用鉴别器列)。您不能定义仅适用于特定行的唯一约束。

如果约束只对某种类型的实体有意义,则必须将它们映射到单独的表中。

使用InheritanceType.TABLE_PER_CLASS

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Produto {
...
   @Column(name="codigoEAN")
   private String codigoEAN;
}

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"codigoEAN"})})
public class ProdutosEmCaixa extends Produto {
 ...
}

InheritanceType.JOINED

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "tipo")
@DiscriminatorValue("Produto")
public class Produto {
...

}

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"codigoEAN"})})
@DiscriminatorValue("Caixa")
public class ProdutosEmCaixa extends Produto {
 ...
   @Column(name="codigoEAN")
   private String codigoEAN;
}

有关 mapping inheritance 的更多详细信息,请参阅 Hibernate ORM 文档。