package com.lesson3; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javassist.expr.NewArray; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name="user") public class User implements Serializable{ @Override public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); } @Override public int hashCode() { // TODO Auto-generated method stub return super.hashCode(); } /** * */ private static final long serialVersionUID = 2451911845206634594L; private String id; private String name; private Set<Card> card; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY) @JoinColumn(name="card_id",referencedColumnName="name") //card_id为card表外键,referencedColumnName为本表字段 public Set<Card> getCard() { return card; } public void setCard(Set<Card> card) { this.card = card; } @Id @GeneratedValue(generator="getUuid",strategy=GenerationType.AUTO) @GenericGenerator(name="getUuid",strategy="uuid") @Column(name="id",nullable=false,unique=true) public String getId() { return id; } public void setId(String id) { this.id = id; } @Column(name="name",length=128) public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.lesson3; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; @Entity public class Card { private int id; private String info; @Id @GeneratedValue(strategy=GenerationType.AUTO) public int getId() { return id; } public void setId(int id) { this.id = id; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
package com.lesson3; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; public class Service { private SessionFactory sessionFactory; public Service() { this.sessionFactory = new AnnotationConfiguration().configure("com/lesson3/lesson3.cfg.xml").buildSessionFactory(); } public void Insert(){ Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); try { User user = new User(); user.setId("123"); user.setName("ccc"); Set<Card> cards = new HashSet<Card>(); for (int i = 0; i < 2; i++){ Card card = new Card(); card.setInfo("card"); cards.add(card); } user.setCard(cards); session.save(user); tx.commit(); } catch (Exception e) { // TODO: handle exception tx.rollback(); e.printStackTrace(); }finally{ session.close(); } } }
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql://127.0.0.2:3306/test</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="format_sql">true</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping class="com.lesson3.User"/> <mapping class="com.lesson3.Card"/> </session-factory> </hibernate-configuration>
当关联到的主表的字段不是主键时,要实现Serializable接口
否则出现以下错误
java.lang.ClassCastException: com.lesson3.User cannot be cast to java.io.Serializable
at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:390)
at org.hibernate.engine.internal.Collections.processReachableCollection(Collections.java:187)
at org.hibernate.event.internal.FlushVisitor.processCollection(FlushVisitor.java:59)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:121)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:82)
at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:174)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:228)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:100)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at com.lesson3.Service.Insert(Service.java:42)
at test.com.lesson3.TestService.testInsert(TestService.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)