首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPA集合在映射表中具有不需要的唯一约束

JPA集合在映射表中具有不需要的唯一约束
EN

Stack Overflow用户
提问于 2013-04-12 21:23:03
回答 2查看 5.5K关注 0票数 8

当我使用hibernate.hbm2ddl.auto=create自动生成数据库时,在映射表中创建了一个“不需要的”唯一约束。我正在运行postgres 9.1,create table语句变成:

代码语言:javascript
复制
CREATE TABLE schemaname.scanalerts
(
  scanid bigint NOT NULL,
  alerts_id bigint NOT NULL,
  CONSTRAINT fkd65bd7541b5b1a8e FOREIGN KEY (scanid)
      REFERENCES rfid.scan (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkd65bd754860b0886 FOREIGN KEY (alerts_id)
      REFERENCES rfid.alert (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id ),
  CONSTRAINT scanalerts_scanid_alerts_id_key UNIQUE (scanid , alerts_id )
)

不需要的约束是CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id ),基本上我只想要scanid和alerts_id上的唯一约束。

我使用JPA注释来创建映射,以下是我的代码:

代码语言:javascript
复制
@ElementCollection(targetClass = Alert.class, fetch = FetchType.EAGER)
@CollectionTable(name = "scanalerts", schema = RfidConstants.SCHEMA, 
    joinColumns = @JoinColumn(name = "scanid"), 
    uniqueConstraints = @UniqueConstraint(columnNames = { "scanid", "alerts_id" }))
private List<Alert> alerts;

有什么方法可以停止创建alert_id唯一约束吗?

谢谢

@JBNizet这里是Alert映射注释:

代码语言:javascript
复制
@Entity
@Table(name = "alert", schema = "schemaname", 
    uniqueConstraints = @UniqueConstraint(columnNames = {"message", "alertPriority"}) )
public class Alert implements Serializable {

    @Id
    @Column(name="id")
    @SequenceGenerator(name = "alertSeq", sequenceName="ALERT_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "alertSeq")
    private Long id;

    @Column(name="versionnum")
    @Version
    private Long version;

    @Column(name = "message", nullable = false)
    private String message;

    @Column(name = "alertpriority", nullable = false)
    @Enumerated(EnumType.STRING)
    private AlertPriority alertPriority;
EN

Stack Overflow用户

回答已采纳

发布于 2013-04-13 02:00:23

例如在JavaDocs中所说的,@ElementCollection用于映射基本类型或可嵌入对象的集合。Alert是一个实体,因此List<Alert>不是基本类型或可嵌入对象的集合。

因为由scanidalert_id组成的唯一约束是首选的,所以我假设ScanAlert之间的关系具有多对多的性质。这可以通过以下方式实现:

代码语言:javascript
复制
@ManyToMany
@JoinTable(name = "scanalerts",  schema = RfidConstants.SCHEMA,
  joinColumns = @JoinColumn(name = "scanid"),
  inverseJoinColumns = @JoinColumn(name = "alert_id")
)
private List<Alert> alerts;

表的主键包含这两列,这就是为什么不需要使用@UniqueConstraint

票数 10
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15972549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档