我们项目用的是ibatis,好久没写hibernate,手生,练习中发现几个以前没有多想的问题,跟大家分享下
首先:数据库字段设为自增长的时候,比如现在数据库里面的id是1,那么我继续插入,如果失败,下次我再插入结果就是3
我删除数据库所有数据,再次强势再插入结果是4
这个数据库是怎么回事,为什么插入失败,下次再插入,他会是3,删除所有数据,再次插入会是4呢?
以前一直用,还真没想过
其次:
多对多关系,一方是维护段,这个从逻辑上不好弄,值有一方维护着多对多的表。
如果要删除,还要通过那个表,加入数据也是,不然会报错。这个大家是怎么解决的,就这么将就的。
这里面的具体逻辑是怎么一个,为什么会这样设计
再有:两个多对多表,在实体间删除操作的时候,存在以下问题
两个实体如下
以上操作部会有问题,当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);
解决问题
欢迎大家来讨论
首先:数据库字段设为自增长的时候,比如现在数据库里面的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);
解决问题
欢迎大家来讨论