NutzCN Logo
问答 一对一映射建表插入时,主键没有自增且默认为0是怎么回事啊?
发布于 2195天前 作者 mozhaojian 1644 次浏览 复制 上一个帖子 下一个帖子
标签:

在看官方的文档时,测试了一下一对一映射建表,对应关系是一个pet对应一个master,然后建表插入遇到了如题的问题,以下是我的pojo类:

Pet类,

package demo.hello.pojo;

import org.nutz.dao.entity.annotation.*;
@Table("t_pet")
public class Pet {
	@Id(auto=true) // 表示该字段为一个自增长的Id,注意,是数据库表中自增!!
	//@Prev(els=@EL("$me.getId()"))
	//@Next(@SQL("SELECT t_pet('id')"))
	private Integer id;// @Id与属性名称id没有对应关系
	@Column
	private String pname;
	@Column
	private Integer age;
	
	@Column
	@Prev(@SQL ("SELECT photoPath from t_pet where pname = @pname"))
	private String photoPath;
	
	@Column
	private int masterId;
	@One(target=Master.class,field="masterId")
	
	private Master master;
	
	public int getMasterId() {
		return masterId;
	}
	public void setMasterId(int masterId) {
		this.masterId = masterId;
	}
	public Master getMaster() {
		return master;
	}
	public void setMaster(Master master) {
		this.master = master;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getPhotoPath() {
		return photoPath;
	}
	public void setPhotoPath(String photoPath) {
		this.photoPath = photoPath;
	}
	@Override
	public String toString() {
		return "Pet [id=" + id + ", pname=" + pname + ", age=" + age + ", photoPath=" + photoPath + ", masterId="
				+ masterId + ", master=" + master + "]";
	}
}

Master类:

package demo.hello.pojo;

import org.nutz.dao.entity.annotation.*;

@Table("t_master")
public class Master {
	@Id
	private Integer masterId;
	@Column
	private String name;
	@Column
	private Integer age;
	public Integer getMasterId() {
		return masterId;
	}
	public void setMasterId(Integer masterId) {
		this.masterId = masterId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Master [masterId=" + masterId + ", name=" + name + ", age=" + age + "]";
	}
	
}

第一次插入,成功且没有问题:

		dao.create(Master.class, false);
                Pet pet = new Pet();
		pet.setPname("tomcat");
		Master master = new Master();
		master.setName("chris");
		
		dao.insertWith(pet, "master");

7 回复

第二次插入,问题就来了:

dao.create(Pet.class, false);
		dao.create(Master.class, false);
		Pet pet = new Pet();
		pet.setPname("jerrymouse");
		Master master = new Master();
		master.setName("chris");

出现错误如下,提示我主键为0重复了:

Exception in thread "main" org.nutz.dao.DaoException: !Nutz SQL Error: 'INSERT INTO t_pet(pname,age,photoPath,masterId) VALUES('jerrymouse',NULL,NULL,0) '
PreparedStatement: 
'INSERT INTO t_pet(pname,age,photoPath,masterId) VALUES(?,?,?,?) '

这是怎么回事啊?是因为一对一建表所以我必须得手动设置主键的值吗?

不是自增就不要设置@Id(auto=true) 呀 要设置成false, 插入前设置好值

这样的啊,我本意是想让它自增的,看来还是得手动设置了

等等, 你的表的id字段要自增呀, 然后@Id(auto=true) 就好啦

对呀,我就是想让t_pet表的id自增的,也@Id(auto=true)啦,但是我重复执行下面这段代码(每次执行把Pet的名字改了)就会报错:

dao.create(Pet.class, false);
		dao.create(Master.class, false);
		Pet pet = new Pet();
		pet.setPname("jerrymouse");
		Master master = new Master();
		master.setName("chris");
		
		dao.insertWith(pet, "master");

数据库表是nutz建的吗? 看看id是不是自增状态

可以了,原来刚才数据表不是自增状态的,可能是我用@Id(auto=false)建的表后没删表重建,操作错误了,谢谢老哥!!!!!

添加回复
请先登陆
回到顶部