锁定老帖子 主题:hibernate引出的几个纠结事件分析
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-25
最后修改:2011-04-25
首先:数据库字段设为自增长的时候,比如现在数据库里面的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); 解决问题 欢迎大家来讨论 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-25
你说的那个id的问题确实如此,虽然对程序没影。响,但是还是看着不爽
对于当Brand不是查询出来的时候,是自己new的时,Brand不是查询出来的不是一个持久化的对象,当你remove的时候就会报错,你可以设置下他们的级联啊。 |
|
返回顶楼 | |
发表时间:2011-04-26
jk19910410 写道 你说的那个id的问题确实如此,虽然对程序没影。响,但是还是看着不爽
对于当Brand不是查询出来的时候,是自己new的时,Brand不是查询出来的不是一个持久化的对象,当你remove的时候就会报错,你可以设置下他们的级联啊。 不是设置级联的问题吧 |
|
返回顶楼 | |
发表时间:2011-04-27
没人给再发个话,解释下?
|
|
返回顶楼 | |
发表时间:2011-04-27
猜测第一个问题是
oracle 数据库 select Sequences.nextval from dual 造成的方式. MY SQL 貌似不会这样. |
|
返回顶楼 | |
发表时间:2011-04-27
sy197661944 写道 猜测第一个问题是
oracle 数据库 select Sequences.nextval from dual 造成的方式. MY SQL 貌似不会这样. mysql测试的是mysql |
|
返回顶楼 | |
发表时间:2011-04-27
mysql这个自增设定很合理啊, 插入了id 1 2 3 4 5然后把3删了,那nextval你觉得应该是3还是6好呢?
而且mysql的自增种子是可以改的 |
|
返回顶楼 | |
发表时间:2011-04-27
nakupanda 写道 mysql这个自增设定很合理啊, 插入了id 1 2 3 4 5然后把3删了,那nextval你觉得应该是3还是6好呢?
而且mysql的自增种子是可以改的 就是这个理,总不能给你产生id的时候,先遍历一下吧.. |
|
返回顶楼 | |
发表时间:2011-04-27
nakupanda 写道 mysql这个自增设定很合理啊, 插入了id 1 2 3 4 5然后把3删了,那nextval你觉得应该是3还是6好呢?
而且mysql的自增种子是可以改的 那操作失败,再次插入的时候怎么变成7了 |
|
返回顶楼 | |
发表时间:2011-04-27
你插入失败后事务有回滚吗?
|
|
返回顶楼 | |