返回信息流用在一个有ORM的环境中。
@Entity
class Foo<PrimaryKeyType> {
@Id
PrimaryKeyType id;
String name;
Integer studentNumber;
String isbn
}
1. 有意义的字段(如姓名,学号,isbn号……)
可以自动保证唯一性。
2. 随机生成的值(Integer或Long,对应MySQL:int not null primary key auto_increment; 或者ObjectId)
这样,姓名、学号、isbn号也可以随意改变了。
3. Object型。让具体的数据库或者DAO选择数据类型。
虽然用SQL可以这样:
UPDATE foo SET name='bar';
即使name是主键也没关系。
但是ORM更习惯这样:
Foo foo = objectRelationMapping.find(Foo.class).first();
foo.setName("bar");
objectRelationMapping.save(foo); // 完全按照id的值决定更新哪个记录
这是一条镜像帖。来源:北邮人论坛 / database / #5464同步于 2011/4/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
【讨论】主键用什么?
wks
2011/4/20镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
我的PHP同事说:“主键一律使用自增量”
虽然我不完全同意。。
另:
但是ORM更习惯这样:
Foo foo = objectRelationMapping.find(Foo.class).first();
foo.setName("bar");
objectRelationMapping.save(foo); // 完全按照id的值决定更新哪个记录
这样跟谁是主键有关系吗?
改变主键的值并不是一个好主意啊。
主键唯一表示了一个对象,改变它的主键,这样的语义是“只是ID变化,但对象所指没变”呢,还是“对象A变为了另一个对象B”?
class Foo {
@Id
Integer id;
String name;
}
Foo foo1 = new Foo();
foo1.setName("foo");
objectRelationMapping(foo1); // 因为id==null,所以insert into Foo (name) values('foo');
Foo foo = objectRelationMapping.find(Foo.class).first();
System.out.println(foo.getId()); // 假设是1
foo.setName("bar");
objectRelationMapping.save(foo); // update Foo set name='bar' where id=1;
foo.setId(2);
foo.setName("baz");
objectRelationMapping.save(foo); // update Foo set name='baz' where id=2; 显然数据库里没有id=2的行。
所以,修改主键确实不是个好主意。
这种表建议使用有意义的字段,明确了主键,数据实体之间的关系也明确了。
对于操作日志类型的表,可以使用自增字段。
【 在 wks (cloverprince) 的大作中提到: 】
: 标 题: 【讨论】主键用什么?
: 发信站: 北邮人论坛 (Wed Apr 20 12:10:49 2011), 站内
:
: 用在一个有ORM的环境中。
: @Entity
: class Foo<PrimaryKeyType> {
: @Id
: PrimaryKeyType id;
: String name;
: Integer studentNumber;
: String isbn
: }
:
: 1. 有意义的字段(如姓名,学号,isbn号……)
: 可以自动保证唯一性。
:
: 2. 随机生成的值(Integer或Long,对应MySQL:int not null primary key auto_increment; 或者ObjectId)
: 这样,姓名、学号、isbn号也可以随意改变了。
:
: 3. Object型。让具体的数据库或者DAO选择数据类型。
:
: 虽然用SQL可以这样:
: UPDATE foo SET name='bar';
: 即使name是主键也没关系。
:
: 但是ORM更习惯这样:
: Foo foo = objectRelationMapping.find(Foo.class).first();
: foo.setName("bar");
: objectRelationMapping.save(foo); // 完全按照id的值决定更新哪个记录
: --
:
: ※ 来源:·北邮人论坛 http://bbs.byr.cn·[FROM: 211.68.2.*]