我正在使用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) 我有一个表有两个ID值的int值.这些ID本身可以在表格中显示任意次数,但它们应该只出现一次.
有没有办法让一对值唯一,并且仍允许单个值多次显示?
作为后续行动,如果可以,可以将这对值用作关键字吗?我目前有一个第3列,用于我的密钥的唯一自动增量值.
这是来自Hibernate的官方教程:
还有一个替代
<composite-id>声明允许使用复合键访问旧数据.其他任何东西都强烈建议不要使用它.
为什么复合键不鼓励?我正在考虑使用一个3列表,其中所有列都是外键,并且一起形成一个主键,在我的模型中是一个有意义的关系.我不明白为什么这是一个坏主意,特别是我将使用它们的索引.
有什么选择?创建一个额外的自动生成列并将其用作主键?我仍然需要查询我的3列!?
简而言之,为什么这句话是真的?什么是更好的选择?
我有两节课.一个是实体类,另一个是复合键类.
代码如下.
@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更改为静态 …
我有一个包含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)
但它正在检查是否存在任何一个约束而不是检查唯一键约束的组合.
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_ID在categories_posts连接表.但是Rails不支持这个(我相信).
为了避免我的数据中具有相同category_id和post_id组合的重复行的可能性,在Rails中缺少复合键的最佳解决方法是什么?
我的假设是:
我正在使用带注释的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) 我在工作中遇到了一个问题,我无法找到有关在RESTful Web服务中针对主键是其他资源ID的组合的资源执行CRUD操作的通常标准或实践的信息.我们使用MVC WebApi来创建控制器.例如,我们有三个表:
Product:PK = ProductIdPart:PK = PartIdProductPartAssoc:PK =(ProductId,PartId)产品可以包含许多部件,而部件可以是许多产品的组件.关联表还包含与关联本身相关的其他信息,而不是可编辑的信息.
我们有ProductsController和PartsController类使用定义为的路由模板处理通常的GET/PUT/POST/DELETE操作:{controller}/{id}/{action}以便以下IRI工作:
/api/Products- 返回所有产品,创建新产品/api/Products/1- 检索/更新/删除产品1/api/Parts- 返回所有部件,创建一个新部件/api/Parts/2- 检索/更新/删除第2部分/api/Products/1/Parts- 获取产品1的所有部件/api/Parts/2/Products- 获取第2部分为组件的所有产品我遇到问题的方法是如何为ProductPartAssoc资源定义路径模板.获取关联数据的路由模板和IRI应该是什么样的?坚持惯例,我希望如下:
/api/ProductPartAssoc- 返回所有关联,创建关联/api/ProductPartAssoc/[1,2]- 检索/更新/删除产品1和第2部分之间的关联我的同事发现这在美学上令人不悦,并且似乎认为最好不要有一个ProductPartAssocController类,而是添加其他方法ProductsController来管理关联数据:
/api/Products/1/Parts/2- 获取产品1和第2部分之间关联的数据,而不是第2部分作为第1部分成员的数据,这通常是基于其他示例的情况,例如/Book/5/Chapter/3我在其他地方看到的情况.在一天结束时,我想我要求的是验证,或者我可以指出的方向,并说"看,这是其他人做的."
处理复合键识别的资源的典型做法是什么?
rest composite-key asp.net-web-api attributerouting asp.net-web-api-routing
场景:
我有一个引用两个外键的表,并且对于这些外键的每个唯一组合,都有自己的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.我希望尽可能简单地实现这一点(即如果可能的话,避免使用触发器/程序 - 这是针对其他问题的类似情况而建议的).
我正在阅读候选键和复合键.我才知道
对于复合键,我已经引用了这个链接
如何使用SQL Server Management Studio创建复合键?
因此,当候选键和复合键都是列的组合时,它们可以作为主键.那究竟是什么区别?你能用例子解释一下吗?
composite-key ×10
java ×4
hibernate ×3
database ×2
mysql ×2
sql ×2
annotations ×1
constraints ×1
innodb ×1
jpa ×1
jpql ×1
one-to-many ×1
oracle ×1
orm ×1
rest ×1
unique-key ×1