论坛首页 入门技术论坛

hibernate引出的几个纠结事件分析

浏览 8689 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-04-25   最后修改:2011-04-25
我们项目用的是ibatis,好久没写hibernate,手生,练习中发现几个以前没有多想的问题,跟大家分享下

首先:数据库字段设为自增长的时候,比如现在数据库里面的id是1,那么我继续插入,如果失败,下次我再插入结果就是3

我删除数据库所有数据,再次强势再插入结果是4

这个数据库是怎么回事,为什么插入失败,下次再插入,他会是3,删除所有数据,再次插入会是4呢?

以前一直用,还真没想过

其次:
多对多关系,一方是维护段,这个从逻辑上不好弄,值有一方维护着多对多的表。
如果要删除,还要通过那个表,加入数据也是,不然会报错。这个大家是怎么解决的,就这么将就的。

这里面的具体逻辑是怎么一个,为什么会这样设计

再有:两个多对多表,在实体间删除操作的时候,存在以下问题

两个实体如下
package com.jpa.bean;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Brand {
	
	private String name;
	private Set<Person> persons=new HashSet<Person>();
	
	@Id
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@ManyToMany(cascade={CascadeType.PERSIST},mappedBy="brands")
	public Set<Person> getPersons() {
		return persons;
	}
	public void setPersons(Set<Person> persons) {
		this.persons = persons;
	}
	
	
	

}





package com.jpa.bean;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Person {
	
	private int id;
	private Set<Brand> brands=new HashSet<Brand>();
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@ManyToMany(cascade={CascadeType.PERSIST})
	@JoinTable(inverseJoinColumns=@JoinColumn(name="person_id"),
			joinColumns=@JoinColumn(name="brand_id"))
	public Set<Brand> getBrands() {
		return brands;
	}
	public void setBrands(Set<Brand> brands) {
		this.brands = brands;
	}
	
}




/**
		
		em.getTransaction().begin();
		Brand b=em.getReference(Brand.class, "ANTA");
		
		Person p=em.getReference(Person.class, 7);
		p.getBrands().remove(b);
		em.remove(p);
	
		em.getTransaction().commit();


以上操作部会有问题,当Brand不是查询出来的时候,是自己new的
Brand b=new Brand();
b.setName("ANTA");
那么就会报错,这是为什么?
我的分析是Person p=em.getReference(Person.class, 7);得到的代理,你直接通过p.getBrands().remove(b);并不能接触他们的关系

测试把Person p=em.find(Person.class, 7);
解决问题

欢迎大家来讨论

   发表时间:2011-04-25  
你说的那个id的问题确实如此,虽然对程序没影。响,但是还是看着不爽
对于当Brand不是查询出来的时候,是自己new的时,Brand不是查询出来的不是一个持久化的对象,当你remove的时候就会报错,你可以设置下他们的级联啊。
0 请登录后投票
   发表时间:2011-04-26  
jk19910410 写道
你说的那个id的问题确实如此,虽然对程序没影。响,但是还是看着不爽
对于当Brand不是查询出来的时候,是自己new的时,Brand不是查询出来的不是一个持久化的对象,当你remove的时候就会报错,你可以设置下他们的级联啊。

不是设置级联的问题吧
0 请登录后投票
   发表时间:2011-04-27  
没人给再发个话,解释下?
0 请登录后投票
   发表时间:2011-04-27  
猜测第一个问题是
oracle 数据库
select Sequences.nextval from  dual 造成的方式.


MY SQL 貌似不会这样.
1 请登录后投票
   发表时间:2011-04-27  
sy197661944 写道
猜测第一个问题是
oracle 数据库
select Sequences.nextval from  dual 造成的方式.


MY SQL 貌似不会这样.



mysql测试的是mysql

0 请登录后投票
   发表时间:2011-04-27  
mysql这个自增设定很合理啊, 插入了id 1 2 3 4 5然后把3删了,那nextval你觉得应该是3还是6好呢?

而且mysql的自增种子是可以改的
0 请登录后投票
   发表时间:2011-04-27  
nakupanda 写道
mysql这个自增设定很合理啊, 插入了id 1 2 3 4 5然后把3删了,那nextval你觉得应该是3还是6好呢?

而且mysql的自增种子是可以改的


就是这个理,总不能给你产生id的时候,先遍历一下吧..

0 请登录后投票
   发表时间:2011-04-27  
nakupanda 写道
mysql这个自增设定很合理啊, 插入了id 1 2 3 4 5然后把3删了,那nextval你觉得应该是3还是6好呢?

而且mysql的自增种子是可以改的

那操作失败,再次插入的时候怎么变成7了
0 请登录后投票
   发表时间:2011-04-27  
你插入失败后事务有回滚吗?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics