我们项目用的是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);
解决问题
欢迎大家来讨论
分享到:
相关推荐
Hibernate 源码分析过程 Hibernate 是一个基于 Java 的 ORM(Object-Relation Mapping)框架,允许开发者使用面向对象的方式与关系数据库交互。在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性...
Hibernate源代码分析 在 Hibernate 框架中,SessionFactory 和 ConnectionProvider 是两个非常重要的组件,了解它们的实现机制对于深入了解 Hibernate 的工作原理具有重要意义。本文将通过分析 Hibernate 的源代码...
在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类扮演着系统环境变量的关键角色,它定义...
**描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象(通常是Java类,对应数据库中的表)、一个辅助类(可能是配置或者工具类,帮助操作数据库)以及一个测试类(用于验证代码功能)。这个例子特别...
在Java的持久化框架Hibernate中,事件监听机制是其核心特性之一,它允许开发者在特定的数据操作前后执行自定义逻辑。这里的"hibernate事件 刷新事件.zip"资源可能包含了关于如何理解和应用Hibernate中的刷新事件...
**Hibernate源码分析** Hibernate,一个著名的开源Java对象关系映射(ORM)框架,通过将Java对象和数据库表之间的映射关系自动化,极大地简化了数据访问层的开发工作。本篇将深入探讨Hibernate的源码,揭示其执行...
Hibernate是由 Gavin King 创建的一个开源项目,它提供了一种在Java应用中持久化对象到关系数据库的解决方案。通过ORM,Hibernate将对象模型与关系数据库模型进行映射,使得开发人员可以使用面向对象的方式来处理...
一个最简单的Hibernate project(不涉及Struts, Tomcat, XDoclet,JBoss等东东)必须的几个东东: 1. Hibernate工具包。 2. JDBC数据库连接驱动。以mysql为例,mysql-connector-java-3.1.×-bin.jar。 3. 配置...
学习hibernate的必备,提供一个简易的流程图,方便记忆和查找
首先,Hibernate是一个全面的对象关系映射框架,它简化了Java应用程序与数据库之间的交互。通过Hibernate,开发者可以用面向对象的方式处理数据,而无需直接编写SQL语句。Hibernate的核心组件包括Configuration对象...
Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等信息。 配置 Hibernate 连接...
Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...
### 优化Hibernate性能的几点建议 ...总之,通过上述几个方面的优化措施,可以显著提高基于Hibernate构建的应用程序的性能。在实际应用中,还需要结合具体的业务场景和技术栈来灵活调整这些策略。
Hibernate-Extensions能够自动记录和打印执行的SQL语句,这对于调试和性能分析非常有帮助。开发者可以通过配置开启或关闭这一功能,以便在需要时查看SQL详情,找出潜在的性能瓶颈。 四、时间戳更新 在数据库操作中...
在本篇中,作者聚焦于几个关键的组件和机制,帮助读者理解 Hibernate 如何高效地管理和操作数据库。 首先,文章可能会涉及Hibernate的核心接口`Session`。`Session`是Hibernate工作流程中的重要角色,它负责持久化...
在MyEclipse和Eclipse中,配置Hibernate通常包括以下几个步骤: 1. 添加Hibernate库:你需要导入Hibernate的jar文件或者通过Maven/Gradle等构建工具管理依赖。 2. 配置Hibernate:创建`hibernate.cfg.xml`配置文件,...
关于Hibernate的知识点涵盖以下几个方面: 1. **实体管理**:Hibernate通过@Entity注解将Java类映射为数据库表,通过@Id指定主键,使得对象可以直接对应到数据库记录。 2. **配置**:Hibernate的配置文件(如...
使用 Hibernate 的步骤主要包括以下几个步骤: * 导入 jar 包:在项目中添加 Hibernate 的 jar 包,以便使用 Hibernate。 * 添加配置文件:在项目的 src 目录下添加 hibernate.cfg.xml 配置文件,以便配置 ...
**hibernate源码分析:启动过程** 在深入探讨Hibernate启动过程之前,首先需要了解Hibernate是什么。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发人员提供了一种在Java应用程序中操作数据库的方式...
11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...