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

本文探讨了使用Hibernate框架处理多对多关系时遇到的问题,包括自增长ID的行为、多对多关系的维护及实体关系管理中的注意事项。
我们项目用的是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);
解决问题

欢迎大家来讨论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值