标签: composite-key

如何用嵌入式id编写JPQL SELECT?

我正在使用Toplink essentials(JPA)+ GlassFish v3 + NetBean 6.9

我有一个复合主键表:

table (machine)
----------------
|PK machineId  |
|PK workId     |
|              |
|______________|
Run Code Online (Sandbox Code Playgroud)

我为实体本身创建了两个实体类,第二个是PK类.

public class Machine {
   @EmbeddedId
   protected MachinePK machinePK;

   //getter setters of fields..
}

public class MachinePK {
    @Column(name = "machineId")
    private String machineId;

    @Column(name = "workId")
    private String workId;

}
Run Code Online (Sandbox Code Playgroud)

现在.. 如何使用JPERE用WHERE编写SELECT子句?

这失败了.

SELECT m FROM Machine m WHERE m.machineId = 10
Run Code Online (Sandbox Code Playgroud)

http://www.mail-archive.com/users@openjpa.apache.org/msg03073.html

根据网页,添加"val"?不,它也失败了.

   SELECT m FROM Machine m WHERE m.machineId.val = 10
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,错误是:

    Exception Description: Error compiling the …
Run Code Online (Sandbox Code Playgroud)

java jpa composite-key jpql

41
推荐指数
2
解决办法
5万
查看次数

MySQL - 使一对值唯一

我有一个表有两个ID值的int值.这些ID本身可以在表格中显示任意次数,但它们应该只出现一次.

有没有办法让一对值唯一,并且仍允许单个值多次显示?

作为后续行动,如果可以,可以将这对值用作关键字吗?我目前有一个第3列,用于我的密钥的唯一自动增量值.

mysql composite-key unique-key

39
推荐指数
2
解决办法
3万
查看次数

为什么复合键在休眠时不鼓励?

这是来自Hibernate的官方教程:

还有一个替代<composite-id>声明允许使用复合键访问旧数据.其他任何东西都强烈建议不要使用它.

为什么复合键不鼓励?我正在考虑使用一个3列表,其中所有列都是外键,并且一起形成一个主键,在我的模型中是一个有意义的关系.我不明白为什么这是一个坏主意,特别是我将使用它们的索引.

有什么选择?创建一个额外的自动生成列并将其用作主键?我仍然需要查询我的3列!?

简而言之,为什么这句话是真的?什么是更好的选择?

java database orm hibernate composite-key

37
推荐指数
3
解决办法
2万
查看次数

Hibernate中内部类的实体没有默认构造函数

我有两节课.一个是实体类,另一个是复合键类.

代码如下.

@Entity
public class Supply {

    @Embeddable
    class Id implements Serializable {

        @Column(name = "supplier_id")
        private long supplierId;
        @Column(name = "merchandise_id")
        private long merchandiseId;

        public Id() {
        }

        public Id(long sId, long mId) {
            this.supplierId = sId;
            this.merchandiseId = mId;
        }
    }

    @EmbeddedId
    private Id id = new Id();
}
Run Code Online (Sandbox Code Playgroud)

如果我用试试找

from Supply where merchandise_id=%d and supplier_id=%d
Run Code Online (Sandbox Code Playgroud)

Hibernate将抛出异常,即:

No default constructor for entity: com.entity.Supply$Id; nested exception is org.hibernate.InstantiationException: No default constructor for entity: com.entity.Supply$Id
Run Code Online (Sandbox Code Playgroud)

但是,我发现如果我将 ID更改为静态 …

java hibernate composite-key

32
推荐指数
2
解决办法
3万
查看次数

如何为Oracle中的列组合提供唯一约束?

我有一个包含4列的表

每列将是A,B,C,D

A列是主键.B列具有唯一的名称约束.

现在我想删除B列的唯一约束,并通过组合B,C和D列来提供唯一约束.因此,该表将只允许在B,C和D列中具有特定值的一行.

我怎样才能给出这种类型的约束?

我尝试给出复合唯一键,如:

ALTER TABLE TABLENAME ADD CONSTRAINT CONSTRAINT_NAME UNIQUE (COLUMN_B, COLUMN_C, COLUMN_D)
Run Code Online (Sandbox Code Playgroud)

但它正在检查是否存在任何一个约束而不是检查唯一键约束的组合.

sql oracle constraints composite-key unique-constraint

32
推荐指数
2
解决办法
7万
查看次数

在连接表中,Rails缺少复合键的最佳解决方法是什么?

create_table :categories_posts, :id => false do |t|
  t.column :category_id, :integer, :null => false
  t.column :post_id, :integer, :null => false
end
Run Code Online (Sandbox Code Playgroud)

我有一个连接表(如上所述),其中的列引用了相应的类别表和posts表.我想执行的唯一约束组合键CATEGORY_ID,POST_IDcategories_posts连接表.但是Rails不支持这个(我相信).

为了避免我的数据中具有相同category_id和post_id组合的重复行的可能性,在Rails中缺少复合键的最佳解决方法是什么?

我的假设是:

  1. 在这种情况下,默认的自动编号列(id:整数)无法保护我的数据.
  2. ActiveScaffold可能会提供一个解决方案,但我不确定将它包含在我的项目中仅仅针对这个单一功能是否过度,特别是如果有更优雅的答案.

database ruby-on-rails composite-key junction-table

30
推荐指数
4
解决办法
8387
查看次数

@OneToMany和复合主键?

我正在使用带注释的Hibernate(在spring中),并且我有一个对象,它有一个有序的,多对一的关系,一个子对象有一个复合主键,其中一个组件是一个外键回到父对象的id.

结构看起来像这样:

+=============+                 +================+
| ParentObj   |                 | ObjectChild    |
+-------------+ 1          0..* +----------------+
| id (pk)     |-----------------| parentId       |
| ...         |                 | name           |
+=============+                 | pos            |
                                | ...            |
                                +================+
Run Code Online (Sandbox Code Playgroud)

我尝试了各种注释组合,但似乎都没有.这是我能够提出的最接近的:

@Entity
public class ParentObject {
    @Column(nullable=false, updatable=false)
    @Id @GeneratedValue(generator="...")
    private String id;

    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
    @IndexColumn(name = "pos", base=0)
    private List<ObjectChild> attrs;

    ...
}

@Entity
public class ChildObject {
    @Embeddable
    public static class Pk implements Serializable {
        @Column(nullable=false, updatable=false)
        private String parentId;

        @Column(nullable=false, updatable=false)
        private …
Run Code Online (Sandbox Code Playgroud)

java annotations hibernate composite-key one-to-many

29
推荐指数
3
解决办法
6万
查看次数

组合密钥资源REST服务

我在工作中遇到了一个问题,我无法找到有关在RESTful Web服务中针对主键是其他资源ID的组合的资源执行CRUD操作的通常标准或实践的信息.我们使用MVC WebApi来创建控制器.例如,我们有三个表:

  • Product:PK = ProductId
  • Part:PK = PartId
  • ProductPartAssoc:PK =(ProductId,PartId)

产品可以包含许多部件,而部件可以是许多产品的组件.关联表还包含与关联本身相关的其他信息,而不是可编辑的信息.

我们有ProductsControllerPartsController类使用定义为的路由模板处理通常的GET/PUT/POST/DELETE操作:{controller}/{id}/{action}以便以下IRI工作:

  • GET,POST /api/Products- 返回所有产品,创建新产品
  • GET,PUT,DELETE /api/Products/1- 检索/更新/删除产品1
  • GET,POST /api/Parts- 返回所有部件,创建一个新部件
  • GET,PUT,DELETE /api/Parts/2- 检索/更新/删除第2部分
  • 获取 /api/Products/1/Parts- 获取产品1的所有部件
  • 获取 /api/Parts/2/Products- 获取第2部分为组件的所有产品

我遇到问题的方法是如何为ProductPartAssoc资源定义路径模板.获取关联数据的路由模板和IRI应该是什么样的?坚持惯例,我希望如下:

  • GET,POST /api/ProductPartAssoc- 返回所有关联,创建关联
  • GET,PUT,DELETE /api/ProductPartAssoc/[1,2]- 检索/更新/删除产品1和第2部分之间的关​​联

我的同事发现这在美学上令人不悦,并且似乎认为最好不要有一个ProductPartAssocController类,而是添加其他方法ProductsController来管理关联数据:

  • GET,PUT,DELETE /api/Products/1/Parts/2- 获取产品1和第2部分之间关联的数据,而不是第2部分作为第1部分成员的数据,这通常是基于其他示例的情况,例如/Book/5/Chapter/3我在其他地方看到的情况.
  • POST没有任何线索,他们期望IRI看起来像什么.不幸的是,他们是决策者.

在一天结束时,我想我要求的是验证,或者我可以指出的方向,并说"看,这是其他人做的."

处理复合键识别的资源的典型做法是什么?

rest composite-key asp.net-web-api attributerouting asp.net-web-api-routing

23
推荐指数
1
解决办法
8764
查看次数

在MySQL中使用自动增量定义复合键

场景:

我有一个引用两个外键的表,并且对于这些外键的每个唯一组合,都有自己的auto_increment列.我需要实现一个复合键,它将使用这三个组合(一个外键和一个auto_increment列,另一个列具有非唯一值)帮助将行标识为唯一

表:

CREATE  TABLE `issue_log` (
`sr_no` INT NOT NULL AUTO_INCREMENT ,
  `app_id` INT NOT NULL ,
  `test_id` INT NOT NULL ,
  `issue_name` VARCHAR(255) NOT NULL ,
primary key (app_id, test_id,sr_no)
);
Run Code Online (Sandbox Code Playgroud)

当然,我的查询必定有问题,因为抛出的错误是:

错误1075:表定义不正确; 只能有一个自动列,必须将其定义为键

我想要实现的目标:

我有一个Application Table(以app_id作为主键),每个Application都有一组要解决的问题,每个Application都有多个测试(所以test_id col)sr_no col应该为唯一的app_id和test_id递增.

即表中的数据应如下所示:

在此输入图像描述

数据库引擎是InnoDB.我希望尽可能简单地实现这一点(即如果可能的话,避免使用触发器/程序 - 这是针对其他问题的类似情况而建议的).

mysql innodb composite-key auto-increment

22
推荐指数
3
解决办法
2万
查看次数

候选键和复合键有什么区别?

我正在阅读候选键和复合键.我才知道

  • 候选键可以作为主键,它可以是单列或列组合
  • 复合键也是列的组合.

对于复合键,我已经引用了这个链接

如何使用SQL Server Management Studio创建复合键?

因此,当候选键和复合键都是列的组合时,它们可以作为主键.那究竟是什么区别?你能用例子解释一下吗?

sql composite-key candidate-key

20
推荐指数
3
解决办法
7万
查看次数