Grails中定义域类后,就可以通过脚手架自动生成各种CRUD操作代码。但是,如果是组合主键所生成的代码中诸多功能是不工作的,包括:
index中点击热点,自动调用show,显示当前记录;
edit功能,
delete功能。。
等等。
之所以不能工作,原因就是使用了复合主键——原来的ID不起作用了,或者说没有了。
所以,必须对域类、控制器、GSP文件都进行相应的修改,才行。
首先是域类的说明:
package cn.edu.cup.unit
import grails.gorm.DetachedCriteria
import groovy.transform.ToString
import org.apache.commons.lang.builder.HashCodeBuilder
@ToString(cache=true, includeNames=true, includePackage=false)
class QuantityStandardUnit implements Serializable {
private static final long serialVersionUID = 1
PhysicalQuantity physicalQuantity
QuantityUnit quantityUnit
QuantityStandardUnit(PhysicalQuantity p, QuantityUnit q) {
this()
physicalQuantity = p
quantityUnit = q
}
@Override
boolean equals(other) {
if (!(other instanceof QuantityStandardUnit)) {
return false
}
other.physicalQuantity?.id ==
physicalQuantity?.id &&
other.quantityUnit?.id == quantityUnit?.id
}
@Override
int hashCode() {
def builder = new HashCodeBuilder()
if (physicalQuantity) builder.append(physicalQuantity.id)
if (quantityUnit) builder.append(quantityUnit.id)
builder.toHashCode()
}
static QuantityStandardUnit get(long physicalQuantityId, long quantityUnitId) {
criteriaFor(physicalQuantityId, quantityUnitId).get()
}
static boolean exists(long physicalQuantityId, long quantityUnitId) {
criteriaFor(physicalQuantityId, quantityUnitId).count()
}
private static DetachedCriteria criteriaFor(long physicalQuantityId, long quantityUnitId) {
QuantityStandardUnit.where {
physicalQuantity == PhysicalQuantity.load(physicalQuantityId) &&
quantityUnit == QuantityUnit.load(quantityUnitId)
}
}
static QuantityStandardUnit create(PhysicalQuantity physicalQuantity, QuantityUnit quantityUnit, boolean flush = false) {
def instance = new QuantityStandardUnit(physicalQuantity, quantityUnit)
instance.save(flush: flush, insert: true)
instance
}
static boolean remove(PhysicalQuantity u, QuantityUnit r, boolean flush = false) {
if (u == null || r == null) return false
int rowCount = QuantityStandardUnit.where { physicalQuantity == u && quantityUnit == r }.deleteAll()
if (flush) { QuantityStandardUnit.withSession { it.flush() } }
rowCount
}
static void removeAll(PhysicalQuantity u, boolean flush = false) {
if (u == null) return
QuantityStandardUnit.where { physicalQuantity == u }.deleteAll()
if (flush) { QuantityStandardUnit.withSession { it.flush() } }
}
static void removeAll(QuantityUnit r, boolean flush = false) {
if (r == null) return
QuantityStandardUnit.where { quantityUnit == r }.deleteAll()
if (flush) { QuantityStandardUnit.withSession { it.flush() } }
}
static constraints = {
quantityUnit validator: { QuantityUnit r, QuantityStandardUnit ur ->
if (ur.physicalQuantity == null || ur.physicalQuantity.id == null) return
boolean existing = false
QuantityStandardUnit.withNewSession {
existing = QuantityStandardUnit.exists(ur.physicalQuantity.id, r.id)
}
if (existing) {
return 'quantityStandardUnit.exists'
}
}
}
static mapping = {
id composite: ['physicalQuantity', 'quantityUnit']
version false
}
}
相关推荐
在关系型数据库中,主键是用于唯一标识表中每一行记录的字段或字段组合。它必须满足两个条件:一是唯一性,即在表中没有重复值;二是非空性,即主键字段的值不能为NULL。在EOS中,主键通常用于索引和查询操作,以...
复合主键(Composite Key)是指由两个或更多个列共同组成的主键,这些列的组合具有唯一性,确保了数据的完整性。在数据库设计中,复合主键是解决某些特定情况下的有效手段。 二、Hibernate中的复合主键配置 在...
4. **`hilo`**:HiLo算法,通过高位和低位值组合生成主键,减少对数据库的访问。 5. **`assigned`**:主键由应用程序指定,Hibernate不负责生成。 6. **`increment`**:在内存中递增主键值,不依赖数据库,适用...
对于像HR模块中使用ID和有效开始日期、结束日期组合成复合唯一索引的表,由于日期范围可能变动,不适合作为主键。因此,处理这些无主键或主键不稳定的表需要采取特殊策略。 二、处理方法 1. **全刷新**:这是最...
在传统的关系数据库中,联合主键是由两个或更多列共同构成的,每个列的值组合起来能确保行的唯一性。在JPA中,我们可以通过`@IdClass`或`@EmbeddedId`注解来定义联合主键。 #### `@IdClass` 使用`@IdClass`注解时...
1. **定义复合主键类** 首先,我们需要创建一个类来表示复合主键。这个类通常会继承自Hibernate的`Serializable`接口,同时使用`@Embeddable`注解标记,表明它是一个可嵌入的实体。例如: ```java import javax....
- 在使用联合主键时,通常不需要生成自增的ID,因为主键是通过组合多个字段生成的。 - 联合主键的每个字段通常都会设置为`@Column(nullable = false)`,确保它们在数据库中都是非空的。 通过以上步骤,你就可以在...
联合主键是指由两个或两个以上列组合起来唯一标识表中每一行数据的一种机制。当单个字段不足以唯一确定一条记录时,可以使用联合主键。 #### 使用JPA注解实现联合主键 在JPA中,我们可以通过`@IdClass`和`@Id`注解...
例如,在一个学生选课系统中,可能需要将“学生ID”和“课程ID”组合起来作为多主键,以准确区分每个学生所选的不同课程。 ### SSH框架中的多主键插入 在SSH框架中处理多主键插入,主要涉及以下几个方面: #### 1...
数据库主键是数据库设计中的核心概念,它是表中一列或多列的组合,用于唯一地标识每一行数据,确保数据的唯一性和完整性。在数据库系统中,主键扮演着至关重要的角色,它不仅用于区分不同记录,还在建立表间关联时...
当使用联合主键时,关联其他实体或执行查询时,需要确保正确处理主键的组合。在关联时,需要使用`@ManyToOne`、`@OneToOne`等注解,同时指定`@JoinColumn`,其中`name`属性应对应于联合主键的每个字段。在查询时,...
1. **缺少主键**:有些表设计时没有明确指定主键,这可能导致后续的数据管理和查询变得困难。例如,对于计算工件等类型的表格,如果缺乏有效的主键,则难以保证数据的唯一性。 - **解决方法**:根据表的具体用途...
- 对于大型或超大型应用,应考虑其他方案如GUID或者组合主键。 #### 六、自增字段作为主键的考虑 1. **实现方式**:使用数据库自身的自增功能(如MySQL的AUTO_INCREMENT)。 2. **优点**: - 实现简单,无需额外...
通常,一个实体可能只有一个主键字段,但有些情况下,为了实现唯一标识,可能需要使用两个或多个字段的组合,这就是所谓的联合主键。本文将深入探讨JPA中的联合主键概念、实现方式以及实际应用。 ### 1. 联合主键的...
当单个字段无法唯一标识表中的记录时,可以使用多个字段的组合作为主键,即复合主键。创建复合主键有两种方式: - **创建时设置**: ```sql CREATE TABLE sc ( studentno INT, courseid INT, score INT, ...
1. **主键**: - 主键应当是对用户没有意义的,以避免用户对其产生误解。 - 主键应该是单列的,以提高连接和筛选操作的效率。 - 永远不要更新主键,除非在数据转换或多数据库合并时进行数据整理。 - 主键不应...
1. **使用@IdClass** `@IdClass`注解允许我们创建一个独立的类(通常是`KeyClass`)来表示联合主键。这个类需要包含与主键字段相对应的属性,并使用`@Id`注解标记它们。例如: ```java public class ...
所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 比如 create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) ) ...
主键可以是单个字段,也可以是多个字段的组合。在创建表时,可以同时创键多个主键字段,但这必须在建表时同时创建,后期不能再添加新的主键字段。 在本篇文章中,我们将通过四个案例对数据库中同时创键多个主键的...
联合主键是指在数据库表中,通过两个或更多个字段的组合来形成唯一的记录标识。这与单字段主键不同,单字段主键只需一个字段即可确保记录的唯一性。在ORMLite中,我们可以通过自定义字段和一些额外的代码来模拟这个...