联合主键二:组件映射方式
来源:互联网 发布:猜骰子源码 编辑:程序博客网 时间:2024/05/17 05:58
将主键所对应的属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,
hinernate.cfg.xml
建表类:CreateTable.java
如果执行两次相同的保存操作,会报主键相同的错误,因为这时候主键已经不是hibernate自动生成了,而是我们根据自己的业务 逻辑自己定义的
重写equals方法和hashCode 方法,原因同联合主键一:普通方式
场景和联合主键一:普通方式相同,只不过该方法将主键单独抽取为一个类,当然在配置文件时需要有所改变,个人感觉该方法比较好
主键类:StudentPrimaryKey.java
package com.fgh.hibernate;import java.io.Serializable;/** * Student 主键类 * * @author fgh * */public class StudentPrimaryKey implements Serializable {private static final long serialVersionUID = 5129414054059220497L;private String cardId;private String name;public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((cardId == null) ? 0 : cardId.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;final StudentPrimaryKey other = (StudentPrimaryKey) obj;if (cardId == null) {if (other.cardId != null)return false;} else if (!cardId.equals(other.cardId))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}学生类:Student.java
package com.fgh.hibernate;/** * * @author fgh * */public class Student {//主键类的引用private StudentPrimaryKey studentPrimaryKey;private int age;public StudentPrimaryKey getStudentPrimaryKey() {return studentPrimaryKey;}public void setStudentPrimaryKey(StudentPrimaryKey studentPrimaryKey) {this.studentPrimaryKey = studentPrimaryKey;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}Student.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.fgh.hibernate.Student" table="student_composite"><!-- 组件映射 使用class属性指定主键类 这里一定要指定好 name属性 否则找不到主键 --><composite-id name="studentPrimaryKey"class="com.fgh.hibernate.StudentPrimaryKey"><key-property name="cardId" column="cardId" type="string"></key-property><key-property name="name" column="name" type="string"></key-property></composite-id><property name="age" column="age" type="int"></property></class></hibernate-mapping>
hinernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration><session-factory><property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="show_sql">true</property><mapping resource="Student.hbm.xml" /></session-factory></hibernate-configuration>
建表类:CreateTable.java
package com.fgh.hibernate;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;public class CreateTable {public static void main(String[] args) {SchemaExport export = new SchemaExport(new Configuration().configure());export.create(true, true);}}测试类:hibernateTest.java
package com.fgh.hibernate;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;/** * 联合主键二 * * @author fgh * */public class HibernateTest {private static SessionFactory sessionFactory;static {try {sessionFactory = new Configuration().configure().buildSessionFactory();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Session session = sessionFactory.openSession();Transaction tx = null;try {tx = session.beginTransaction();// 保存-------begin-------StudentPrimaryKey studentPrimaryKey = new StudentPrimaryKey();studentPrimaryKey.setCardId("123");studentPrimaryKey.setName("zhangsan");Student student = new Student();student.setStudentPrimaryKey(studentPrimaryKey);student.setAge(20);session.save(student);// 保存-------end-------// 查询 -------begin------// Student student = (Student)// session.get(Student.class,studentPrimaryKey);// System.out.println(student.getAge());// 查询 -------end------tx.commit();} catch (Exception e) {e.printStackTrace();if (null != tx) {tx.rollback();}} finally {session.close();}}}
如果执行两次相同的保存操作,会报主键相同的错误,因为这时候主键已经不是hibernate自动生成了,而是我们根据自己的业务 逻辑自己定义的
报错信息:
Hibernate: insert into student_composite (age, cardId, name) values (?, ?, ?)org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch updateat org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)at com.fgh.hibernate.HibernateTest.main(HibernateTest.java:46)Caused by: java.sql.BatchUpdateException: Duplicate entry '123-zhangsan' for key 'PRIMARY'at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)... 8 moreThanks,it's over,I hope for your help!
- 联合主键二:组件映射方式
- Hibernate联合主键映射以及组件映射
- 联合主键用Hibernate注解映射方式
- 2 Hibernate映射 属性 主键 集合 组件 联合主键
- 映射组件属性之⑥:多列作为联合主键
- 联合主键映射
- Hibernate映射联合主键
- Hibernate联合主键映射
- hibernate映射联合主键
- Hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate联合主键映射
- hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate联合主键映射
- Hibernate注解映射联合主键的三种主要方式
- Hibernate学习_010_联合主键映射(Annotation方式)
- 【转】对于学习方式的一些思考
- 当有多个设备online时,命令行窗口通过adb连接指定设备方法
- java IO (三) 字节流与缓冲
- 制约程序员"钱途"的两大最关键因素
- SimpleDateFormat做成员或者静态成员多线程安全隐患
- 联合主键二:组件映射方式
- .net 中异步SOCKET发送数据时碰到的内存问题 (二)
- 编译到执行 关于内存分配
- 一个人的Scrum之准备工作
- OpenGL函数
- cmem模块/DVSDK2.0
- Qt for android
- Oracle数据库通过undo保证一致性读和不发生脏读
- Java 终止线程方法